বাশ স্ক্রিপ্টিং ব্যবহার করে একাধিক ফাইলের নাম পরিবর্তন করুন


27

আমি ব্যাশ স্ক্রিপ্টিং ব্যবহার করে একই ডিরেক্টরিতে একাধিক ফাইলের নাম পরিবর্তন করতে চাই। ফাইলগুলির নাম নিম্নরূপ:

file2602201409853.p
file0901201437404.p  
file0901201438761.p  
file1003201410069.p  
file2602201410180.p

আমি নিম্নলিখিত ফর্ম্যাটটির নাম পরিবর্তন করতে চাই:

file2503201409853.p
file2503201437404.p  
file2503201438761.p  
file2503201410069.p  
file2503201410180.p

আমি পুনর্নবীকরণ কমান্ডটি সম্পর্কে পড়ছিলাম, এবং এটি এটি করার চেষ্টা করছিলাম, তবে এটি কিছুই করে না, আমার মনে হয় সিনট্যাক্স সম্পর্কে আমার কাছে প্রশ্ন রয়েছে। তারপরে আমি পড়লাম যে আপনি mv কমান্ডটি নীচে ব্যবহার করে একটি লুপ তৈরি করতে পারেন :

for file in cmpsms*2014*.p; do
    mv "$file" "${file/cmpsms*2014*.p/cmpsms25032014*.p}"
done

তবে আমি ফাইলগুলির নাম পরিবর্তন করতে পারি না। আমি কি ভুল করছি?



2
প্যারামিটার সম্প্রসারণ প্রতিস্থাপনের এক্সপ্রেশনটির ডানদিকে আপনার প্যাটার্ন এক্সপ্রেশন থাকতে পারে না। আপনি সেখানে কি হবে বলে আশা করেছিলেন *?
কোজিরো

@ কিউই এই প্রশ্নটি ফাইলের নামের একটি অংশ সরিয়ে দেওয়ার বিষয়ে। কিন্তু, অত্যন্ত সন্দেহজনকভাবে সদৃশ।
সিভিএন

2
পরের বার, দয়া করে আপনি যে ফাইলের নাম পরিবর্তন করতে চান তা বর্ণনা করুন (পার্থক্য এবং সাদৃশ্যগুলি দেখার আগে আমাকে মেলার জন্য এটি দেখতে হয়েছিল)। উদাহরণগুলি ভাল, তবে একটি বিবরণ পাশাপাশি উদাহরণগুলি আরও ভাল।
একটি সিএনএন

উত্তর:


42

প্রথমে আপনার নামটি বিবেচনা করা ঠিক ছিল। আপনি যদি পুনর্বিবেচনা করতে অভ্যস্ত না হন তবে সিনট্যাক্সটি কিছুটা অদ্ভুত তবে একবার আপনি কী করছেন তা জানার পরে এটি সবচেয়ে দ্রুত / সংক্ষিপ্ততম রুট:

rename 's/\d{4}/2503/' file*

এটি কেবল প্রথম 4 টি সংখ্যার সাথে মেলে এবং আপনার নির্দিষ্ট করা সংখ্যার জন্য এগুলি অদলবদল করে।

আর একটি পরীক্ষা সাজ ( -vnমানে বাগাড়ম্বরপূর্ণ হতে কিন্তু না কি কিছু) আপনার ফাইলের নামের ব্যবহার করছে:

$ rename 's/\d{4}/2503/' file* -vn
file0901201437404.p renamed as file2503201437404.p
file0901201438761.p renamed as file2503201438761.p
file1003201410069.p renamed as file2503201410069.p
file2602201409853.p renamed as file2503201409853.p
file2602201410180.p renamed as file2503201410180.p

8
দ্রষ্টব্য যে এটি দেবিয়ান এবং ডেরিভেটিভস (উবুন্টু, পুদিনা,…) এর পার্ল নামকরণ। অন্যান্য লিনাক্স ডিস্ট্রিবিউশনে, renameএকটি সম্পূর্ণ আলাদা ফাইলের নামকরণ সরঞ্জাম (যা দেবিয়ান জাহাজ হিসাবে বোঝায় rename.ul)।
গিলস 'দুষ্ট হওয়া বন্ধ করুন'

যদি আপনার বিতরণযোগ্য এ জাতীয় সরঞ্জামের অভাব হয় তবে @ মিশেল ক্যাম্পবেল উত্তরটি দেখুন। আমি মনে করি প্রতিটি বিতরণ ডিফল্টের renameমতো ডিফল্ট প্রতিস্থাপন করে ।
Astery

25

এই কৌতুক করতে হবে:

for f in file*; do mv $f ${f/${f:4:8}/25032014}; done

এটি "25032014" এর সাথে চতুর্থ এবং 12 তম অক্ষরের মধ্যবর্তী স্ট্রিংকে প্রতিস্থাপন করে।


এই for f in file*; do mv $f ${f/${f:4:4}/2503}; doneএছাড়াও কাজ করি।
অবিনাশ রাজ

ওটা সুন্দর. আপনি যদি কেবল শব্দ প্রতিস্থাপনের জন্য একটি নিয়মিত শব্দ করতে চান তবে এটি সেডের মতো কাজ করে। যেমনfor f in *Huge*; do mv $f ${f/Huge/Monstrous}; done
এরিক

1
@ এরিক - আমি আপনার উত্তরটি বিকল্প হিসাবে পোস্ট করেছি কারণ আমি মনে করি এটি আরও স্পষ্ট এবং মার্জিত। আপনিও যদি এটি উত্তর হিসাবে পোস্ট করতে চান - আমি আমার মুছে ফেলব। ধন্যবাদ!
ইয়েসোসফ


এটি আমাকে একটি ত্রুটি দেয়: "এমভি: টার্গেট 'FILE_NAME' কোনও ডিরেক্টরি নয়"
অবেরি

10

এটি উপরের দিক থেকে সত্যই @ এরিকের উত্তর - তবে এটি একটি মার্জিত উত্তর তাই এর প্রতি আরও দৃষ্টি আকর্ষণ করার জন্য আমি এটি যথাযথ উত্তর হিসাবে পোস্ট করছি।

for f in *Huge*; do mv $f ${f/Huge/Monstrous}; done

1
ptrn='file[0-9][0-9][0-9][0-9]2014[0-9][0-9][0-9][0-9][0-9].p'
path=/dir
( set -- "${path}/"${ptrn} ; for f ; do {
    echo "mv ${path}/${f} \
        ${path}/file25032014${f#2014}" 
} ; done )

এই কৌতুক করতে হবে। দ্রষ্টব্য - আমি ভর এমভি কমান্ড হস্তান্তর করার অভ্যাসে নেই - লিখিত হিসাবে এটি কেবল প্রতিধ্বনিত। এটি কাজ করার আগে আপনাকে এটি বাছাই করতে হবে।


1

ডিরেক্টরি ট্র্যাভারসাল সহ লুপিং ছাড়াই এটি করার একটি সহজ নেটিভ উপায় :

find -type f | xargs -I {} mv {} {}.txt

এটি জায়গায় প্রতিটি ফাইলের নতুন নামকরণ করবে।

এবং সমান্তরালকরণের সাথে একটি কার্যকারী উদাহরণের নীচে :

find -name "file*.p" | parallel 'f="{}" ; mv -- {} ${f:0:4}2503${f:8}'

এটি আরও ভাল সমাধান কল্পনা করার জন্য একটি সহজ প্রথম পদ্ধতি ছিল। আপনি যদি একটি কাজ কমান্ড চান একটি করুন:
dtrckd

find -type f -name "file*.p" | parallel 'ext="{}" ; mv -- {} ${ext:0:4}2503${ext:8}'
dtrckd

0

আপনি যদি এই ধরণের কাজটি অনেক কিছু করতে দেখেন তবে "পুনর্নাম.পিএল" সন্ধান করুন। এটি একটি পার্ল স্ক্রিপ্ট, তবে আপনাকে কেবল এটিকে পার্ল কোডটি খাওয়ানোর অনুমতি দেয় (যেমন /// এক্সপ্রেশন হিসাবে), এবং এটি সেই অভিব্যক্তি বা কোডের উপর ভিত্তি করে একটি গণ নামকরণ করবে।

এখানে একটি বেসিক সংস্করণ রয়েছে: http://stackoverflow.org/wiki/Rename.pl তবে জালের চারপাশে অন্যান্য সংস্করণগুলি ভাসমান রয়েছে। এটি প্রায় যুগে যুগে যুগে যুগে এবং যুগে যুগে ছিল।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.