উত্তর:
rename
টুল উবুন্টু সঙ্গে জাহাজ কাপড় এই সাজানোর এ প্রশংসনীয় গরম হয়। আপনি এর মতো ছোট্ট পার্ল এক্সপ্রেশনগুলি এম্বেড করতে পারেন:
rename -n 's/.+/our $i; sprintf("AS%d.txt", 1+$i++)/e' *
এটি কেবল আপনাকে দেখায় যে এটি কী করবে। -n
এটিকে লাইভ-ফায়ার অনুশীলন করতে সরান ।
এটি মূলত একটি ভেরিয়েবলকে মোটামুটি সংজ্ঞায়িত করে এবং আমরা যে ফাইলটি আঘাত করি সেটিকে বাড়িয়ে তোলে। যদি আপনার 10 টিরও বেশি ফাইল থাকতে চলেছে তবে আমি এর মধ্যে কিছু শূন্য-প্যাডিং ব্যবহার করার পরামর্শ দিচ্ছি sprintf
। নিম্নলিখিতটি ভাল আপ 999
:
rename -n 's/.+/our $i; sprintf("AS%03d.txt", 1+$i++)/e' *
... তবে এটি প্রসারিত করার পক্ষে যথেষ্ট সহজ।
@ অলির উত্তরটির উন্নতি করতে , অ্যারিস্টটল পাগাল্টজিস দ্বারা গৃহীত 1.600rename
সরঞ্জাম সংস্করণ আসলে একটি পাল্টা বিল্ট ইন আছে $N
।
সুতরাং আপনার যা প্রয়োজন তা হ'ল
rename 's/AS.*/AS$N/' *
স্থাপন করা,
brew install rename
অথবা স্ক্রিপ্টটি ডাউনলোড করুন/usr/local/bin/brew
বা /usr/bin
)rename
আপনাকে সরাসরি নিয়োগ করতে দেয় $_
যা এই সমস্যার জন্য আদর্শ।যদিও কোড আর্গুমেন্ট আমরা পার্ল পাস rename
ইউটিলিটি প্রায়ই ম্যাচিং এবং প্রতিকল্পন (সঙ্গে সঞ্চালন s/
), এবং এটা সম্পূর্ণই গ্রহণযোগ্য করার এই সমস্যা যে ভাবে সমাধান , সত্যিই এই এক যেখানে আপনি আসলে পরীক্ষা করছি না বা মত ক্ষেত্রে যে জন্য কোন প্রয়োজন পুরানো ফাইল নামগুলির পাঠ্য পুনরায় ব্যবহার করা হচ্ছে। rename
আপনাকে কোনও পার্ল কোড সম্পর্কে লিখতে দেয় এবং এটি ভিতরে এম্বেড করার প্রয়োজন হয় না s/
/e
। আমি এই জাতীয় কমান্ড ব্যবহার করার পরামর্শ দিচ্ছি:
rename -n 'our $i; $_ = sprintf "AS%02d.txt", ++$i' *
অথবা, যদি আপনি কয়েকটি চরিত্রের শেভ করার মতো মনে করেন:
rename -n '$_ = sprintf "AS%02d.txt", ++our$i' *
(এটি আরও খাটো করা যায়, তবে স্বচ্ছতা ছাড়াই নয়))
এই দুটি আদেশই একই কাজ করে। প্রত্যেকে দেখায় যে নামকরণের অপারেশনগুলি কী করা হবে। একবার আপনি একবার চেষ্টা করে দেখুন এবং ফলাফলের সাথে আপনি খুশি হয়ে গেলে -n
বিকল্প ছাড়া আবার চালনা করুন । লিখিত, এই ফাইলের নামের উত্পাদন করবে AS01.txt
, AS02.txt
, ..., AS10.txt
, AS11.txt
, ইত্যাদি। আপনি প্রয়োজন হিসাবে এগুলি সংশোধন করতে পারেন, তবে কেবল অপসারণ করুন-n
আপনি যখন যা দেখতে চান পছন্দ করুন
আপনি যদি 2 এর চেয়ে বেশি প্রস্থে প্যাড করতে চান তবে 2
বড় সংখ্যার সাথে প্রতিস্থাপন করুন । উদাহরণস্বরূপ, যদি কোনও কারণে আপনি ফাইলের নাম পছন্দ AS00000000000001.txt
করতে চান তবে আপনি এটির %02d
সাথে প্রতিস্থাপন করবেন %014d
। আপনি যদি প্যাডিং একেবারেই না চান - যদিও এটি পরে আপনার তালিকা তৈরি করার সময় আপনার ফাইলগুলি অ-সংখ্যাসূচকভাবে প্রদর্শিত হবে! - তবে আপনি %02d
ঠিক সঙ্গে প্রতিস্থাপন করতে পারেন%d
।
কিভাবে কাজ করে? আপনার শেলটি *
এমনকি rename
কমান্ড চালানোর আগে ফাইলগুলির তালিকায় প্রসারিত হয় । আপনার বর্তমান লোকাল সেটিংস অনুসারে তালিকাটি অভিধানিকভাবে (যেমন বর্ণমালা অনুসারে) সাজানো হয়েছে। rename
কমান্ড-লাইন আর্গুমেন্ট হিসাবে ফাইলের নামগুলি গ্রহণ করে এবং সেগুলি তালিকাভুক্ত করা ক্রমে তাদের প্রক্রিয়া করে। অভিব্যক্তিটি ++$i
ভেরিয়েবলের বর্তমান মানের চেয়ে বড়টিকে মূল্যায়ন করে $i
এবং $i
সেই নতুন বর্ধিত মানকে ভেরিয়েবল সেট করে । এই মানটি এতে চলে গেছে sprintf
, যা এটির বিন্যাস করে এটি অন্য পাঠ্যের ভিতরে রাখে। এই পাঠ্যটি সরাসরি বিশেষ ভেরিয়েবলের জন্য বরাদ্দ করা হয় $_
, যা ফাইলের নাম ধারণ করে। যেহেতু rename
প্রসেসগুলি ফাইলগুলিকে ক্রম অনুসারে আর্গুমেন্ট হিসাবে প্রেরণ করা হয়, সেগুলি অনুসারে সেগুলি গণনা করা হয়।
উভয়ই একটি পাল্টা ভেরিয়েবল ঘোষণা করে এবং বৃদ্ধি করে এবং উভয়ই sprintf
নতুন ফাইলের অন্য লেখায় জেরো দিয়ে বামদিকে প্যাড করে সেই কাউন্টারটির মান এম্বেড করার জন্য একইভাবে ব্যবহার করে । (জিরোদের সাথে কীভাবে প্যাড করবেন - এবং প্যাডিংয়ের প্রস্থ পরিবর্তন করা - উভয়ের ক্ষেত্রে সমানভাবে প্রযোজ্য) উভয়ের ক্ষেত্রে যে তথ্য রয়েছে তা উভয় ক্ষেত্রে সমানভাবে প্রযোজ্য)) তারা এতটা মিলের কারণ হ'ল সেই পুরানো উত্তরের পদ্ধতিটি সত্যই এই 1 টি করছে তবে অতিরিক্ত পদক্ষেপগুলি যা অনেক সমস্যার জন্য দরকারী তবে এটির জন্য আসলে প্রয়োজনীয় নয়।
তুলনা করার জন্য, এখানে উত্তরটির দ্বিতীয় কমান্ডটি দেখতে দেখতে দেখতে এখানে ব্যবহার করা শৈলীটি ব্যবহার করে পরিবর্তিত হয়েছে (এবং 3 এর পরিবর্তে আমি 2 টি প্রস্থকে প্যাড করতে চাইছি):
rename -n 's/.+/our $i; sprintf "AS%02d.txt", ++$i/e' *
এই কমান্ডের মধ্যে s/.+/
এবং অংশের অংশটি /e
এখন এই উত্তরের প্রথম কমান্ডে আমি যে অভিব্যক্তিটি নির্ধারণ করেছি $_
(যেমন, =
অপারেটরের ডানদিকে কোড ) তার সমান ।
s/
অপারেটর ম্যাচ টেক্সট প্রচেষ্টা (ফাইলের নামের আপনার শেল থেকে প্রসারিত যে *
এবং কমান্ড লাইন আর্গুমেন্ট যখন এটি দৌড়ে হিসাবে পাস rename
) একটি সঙ্গে রেগুলার এক্সপ্রেশন , এবং সঞ্চালিত প্রতিকল্পন। এক্সপ্রেশন /
বিভিন্ন অংশ পৃথক করতে একটি সীমানা হিসাবে ব্যবহৃত হচ্ছে s
। প্রথম অংশটি, .+
নিয়মিত প্রকাশ; এটি কোনও 1 টি অক্ষরের সাথে.
মেলে ( ) , এবং এটি এক বা একাধিকবার ( +
) করে । যেহেতু ফাইলের নামের খালি না হয় - they're সবসময় অন্তত একটি অক্ষর দীর্ঘ - এই এক উপায় সাথে মেলে হয় 1 ফাইলের নাম।our $i; sprintf "AS%02d.txt", ++$i
। এটি নতুন ফাইলের নাম উত্পাদন করে। সাধারণত, একটি s/
পাঠ্য উত্পাদন করতে ব্যবহার করে যা হয় হয় (ক) ফাইলের নামের কিছু অংশের সাথে মেলে এমন টেক্সটকে প্রতিস্থাপন করা, বা (খ) কোনওভাবে মিলে যাওয়া পাঠ্যের উপর ভিত্তি করে (উদাহরণস্বরূপ, এটি একটি বিশেষ ভেরিয়েবলের মতো ব্যবহার করতে পারে)$&
যা প্রসারিত হয়) ম্যাচটি). এই ক্ষেত্রে, যদিও, ম্যাচযুক্ত পাঠ্যটি মোটেই ব্যবহৃত হচ্ছে না।our $i; sprintf "AS%02d.txt", ++$i
ফাইলের নাম হিসাবে ব্যবহৃত হবে, কোড হিসাবে চালানো হবে না । তবে /e
পতাকাটির শেষে সেই পাঠ্যটিকে পার্ল উত্স কোড হিসাবে বিবেচনা করা হবে এবং মূল্যায়ন করা হবে এবং এটি করে উত্পাদিত মানটিকে sprintf
নতুন ফাইলের নাম হিসাবে (এই ক্ষেত্রে পার্লের অন্তর্নির্মিত ফাংশনের রিটার্ন মান ) ব্যবহার করা হবে।যদিও আমি মনে করি যে আমি এখানে যে পদ্ধতিটি দেখিয়েছি তা যে কোনও পদ্ধতির সাথে ব্যবহার করে তার চেয়ে এই সমস্যার জন্য আরও স্পষ্ট এবং সহজ পদ্ধিতি , তবে সেই কৌশল সম্পর্কে সচেতন হওয়া ভাল, কারণ এটি বেশ কয়েকটি অন্যান্য ফাইলের নাম পরিবর্তন করার সমস্যাগুলির সাথে উপযুক্ত, যেখানে সমস্ত অথবা মূল ফাইলনামগুলির কিছু অংশ পরীক্ষা করা হয় এবং / অথবা ধরে রাখা হয়। আমি সুপারিশ এই ব্লগ পোস্টের দ্বারা অলি (যে মাঝে মাঝে লিখেছিলেন যে উত্তর ), যা কিছু যেমন উদাহরণ অন্তর্ভুক্ত করা হয়েছে।s/
/e
1 টেকনিক্যালি, সেখানে হয় আচরণকে মধ্যে একটি পার্থক্য $_ =
কমান্ড এবং s/
/e
কমান্ড। নিয়মিত অভিব্যক্তিতে .+
এটি কোনও অক্ষরের সাথে .
মেলে এমন কঠোরভাবে সত্য নয় কারণ এটি কোনও নতুন লাইনের সাথে মেলে না । আপনার খুব সম্ভবত এগুলিতে নতুন লাইনের সাথে ফাইলের নাম ব্যবহার করা উচিত নয়, তবে আপনি এটি করতে পারেন এবং মাঝেমধ্যে কোনও ফাইল দুর্ঘটনাক্রমে এই নামে নাম লেখায়। তুমি এটা পছন্দ মনে করেন, আউটপুট বিপরীতে যে এর । করতে একটি newline মেলে, ব্যবহার পতাকা, যা শেষে (সঙ্গে এ যায় )। যে, পরিবর্তে শেষে লিখুন ।rename -n 'our $i; $_ = sprintf "AS%02d.txt", ++$i' $'foo\nbar'
rename -n 's/.+/our $i; sprintf "AS%02d.txt", ++$i/e' $'foo\nbar'
.
s
e
/se
/e
মনে করুন আপনি যে নামটি পরিবর্তন করতে চান ~/Adir
সেগুলি ফাইলগুলিতে রয়েছে এবং এই ফোল্ডারে কেবলমাত্র এই ফাইলগুলিই:
n=0
for f in $( ls ~/Adir | sort ) ; do
n=$(( n+1 ))
mv -n "$f" "AS${n}.txt"
done
এই স্ক্রিপ্টটি প্রতিটি ফাইলের দিকে ~/Adir
তাকাবে এবং AS1.txt, AS2.txt, ...
ফাইলটি বিদ্যমান না থাকলে এটির নামকরণ করবে (কোনও ওভাররাইটিং হবে না)। এ কারণেই আপনার নিশ্চিত হওয়া উচিত যে এগুলিতে কেবলমাত্র ফাইল রয়েছে ~/Adir
। sort
কমান্ড ধরো যদি আপনি ফাইল প্রাথমিক অর্ডার রাখতে চান হয়।
rename
নাম। এটি আরও ভাল হতে পারে তবে আপনি উত্তরটি আরও মূল্যবান করতে ইনস্টলেশন নির্দেশাবলী যুক্ত করতে চাইতে পারেন।