প্যাটার্ন ভিত্তিক, টার্মিনালে ব্যাচ ফাইলটির পুনরায় নামকরণ


48

আমাকে নিম্নলিখিতগুলির নাম পরিবর্তন করতে হবে:

file_001_loremipsum.png
file_002_dolor.png
file_003_sit.png
file_004_amet.png
file_105_randomness.png

মধ্যে

upl_loremipsum.png
upl_dolor.png
upl_sit.png
upl_amet.png
upl_randomness.png

টার্মিনাল কমান্ডের কেবল একটি সাধারণ লাইন দিয়ে কীভাবে এটি ঘটতে পারি?


1
একজন failsafe Regex ভিত্তিক পাইথন সংস্করণ যা সব সাবফোল্ডার উপর যাও recursively কাজ করে: stackoverflow.com/a/39698169/191246
ccpizza

উত্তর:


79

উপরোক্ত উদাহরণটির সমাধান, নাম পরিবর্তন করে :

rename -v -n 's/file_\d{1,3}/upl/' file_*.png

ব্যবহার:

rename [options] [Perl regex search/replace expression] [files]

থেকে man rename:

   -v, --verbose
           Verbose: print names of files successfully renamed.
   -n, --no-act
           No Action: show what files would have been renamed.

নাম পরিবর্তন করুন আর্গুমেন্ট হিসাবে regex নিতে।

আমরা যা দেখছি তা হ'ল একক উদ্ধৃতিগুলির মধ্যে থাকা সামগ্রী '। আপনি রেজেক্সকে আলাদা করে রাখতে পারেন /

সূত্র: s/(1)/(2)/যেখানে (1)= সন্ধানের প্যাটার্ন এবং (2)= প্রতিস্থাপনের প্যাটার্ন।

সুতরাং, নিজেকে রেজেক্সের সাথে পরিচিত করুন এবং প্যাটার্ন ভিত্তিক ব্যাচ ফাইলটির পুনরায় নামকরণ উপভোগ করুন!


14
আমি জানি এটি উবুন্টু, তবে কেউ যদি ওএস এক্স সমাধান (আমি করেছি) সন্ধান করেও এখানে পৌঁছে তবে renameসহজেই এটি ইনস্টল হয়ে গেছে brew install rename
বালুচরিত

উবুন্টু 18.10 এ, পরিবর্তে --no-actপতাকাটি রয়েছে --nono। এই উত্তরটি আরও খানিকটা সুস্পষ্ট হতে পারে: [files]বর্তমান ডিরেক্টরিটিতে প্রাথমিক প্যাটার্ন মেলানো ফাইলগুলি বোঝায় যে কেউ সম্ভাব্য নাম পরিবর্তন করতে চায় (যেমন, *সমস্ত কিছুর সাথে মেলে তবে কেবলমাত্র বর্তমান ডিরেক্টরিতে)।
প্যাট্রিক ডার্ক

আপনার লিঙ্কটি অন্যটিতে নির্দেশ করে rename, এতে ফর্ম্যাট রয়েছে rename from to fileএবং নিয়মিত প্রকাশকে সমর্থন করে না। আসলে, আমার লিনাক্স বিতরণ (সেন্ট ওএস 7) এর ঠিক সেই সংস্করণ রয়েছে।
অ্যালেক্স চে ২:26

6

যদি ফাইলগুলি বিভিন্ন ডিরেক্টরিতে থাকে তবে সন্ধানের মতো পুনরায় নাম ব্যবহার করুন:

find -iname file_*.png -type f -exec rename -n 's/file_[0-9]{3}(.*\.png)/upl$1/' {} \;

-নাম নামকরণের পরে পরীক্ষা করা হয়, এটি এগিয়ে যেতে সরান! -)

এটির মতো, আপনি পাওয়ারটি পুনরায় নামকরণ এবং নামটির সাথে যুক্ত।

ব্যক্তিগতভাবে, আমি সোর্স শিরোনাম। H থেকে .hpp এর নামকরণ করতে এটি ব্যবহার করেছি

find -iname *.h -type f -exec rename 's/(.*\.)h/$1hpp/' {} \;

ডকুমেন্টেশন আছে -iname, -typeএবং -execএ পতাকা manpages.ubuntu.com/manpages/bionic/man1/find.1.html#expression । ( find --helpএই আদেশের জন্য বিশেষভাবে সহায়ক নয়)) টিএল; ডিআর: -inameএকটি প্যাটার্ন কেসের সাথে মেলে matches সংবেদনশীলতার সাথে; -type f"নিয়মিত ফাইল" মেলে; এবং -execকোনও অভিমত কার্যকর করে যতক্ষণ না এটি ;(অর্ধিকোলন) চরিত্রের মুখোমুখি হয় ।
প্যাট্রিক ডার্ক

5

বাশ প্যারামিটার সম্প্রসারণের সামান্য যাদু দিয়ে এটি করা যেতে পারে!

for f in file_[0-9]*_*; do mv $f upl_${f#file_[0-9]*_}; done

file_[0-9]*_*;- 'ফাইল_নিম্বর_' দিয়ে শুরু হওয়া সমস্ত ফাইল ট্রাটে যাওয়ার জন্য প্রথম প্যাটার্ন ব্যবহার করা হয়
${f#file_[0-9]*_}- দ্বিতীয় প্যাটার্নটি file_[0-9]*_প্যারামিটার প্রসারণে ব্যবহৃত হয় যা বাশকে স্ট্রিংয়ের ভিক্ষাবৃত্তি থেকে 'file_anynumber_' অপসারণ করতে বলে।

আরও তথ্যের জন্য Parameter expansion:

man bash

দ্রষ্টব্য যে এটি গ্লোব ব্যবহার করে, রেজেক্স নয়, তাই [0-9]*কোনও অঙ্কের পরে একটি অঙ্কের সাথে মিলবে। স্রেফ সংখ্যার সাথে মেলে যাওয়ার আরও ভাল উপায় সম্ভবত আছে, তবে আমি কোনও সংক্ষেপের কথা ভাবতে পারি না।
wjandrea

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