टर्मिनल में पैटर्न आधारित, बैच फ़ाइल का नाम


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

मैं इसे टर्मिनल कमांड की सिर्फ एक सरल रेखा के साथ कैसे बना सकता हूं?


जवाबों:


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)= प्रतिमान बदलें।

तो, regex के साथ खुद को परिचित करें , और पैटर्न आधारित बैच फ़ाइल का नामकरण का आनंद लें!


14
मुझे पता है कि यह उबंटू है, लेकिन अगर कोई यहां समाप्त होता है, भले ही वे ओएस एक्स समाधान (I did) की तलाश में थे, renameआसानी से स्थापित है brew install rename
सैंडस्ट्रॉम

Ubuntu 18.10 में, --no-actध्वज --nonoइसके बजाय है। यह उत्तर थोड़ा और अधिक स्पष्ट हो सकता है: [files]वर्तमान निर्देशिका में एक प्रारंभिक पैटर्न से मेल खाने वाली फ़ाइलों को संदर्भित करता है जो कि संभावित रूप से नाम बदलना चाहता है (जैसे, *सब कुछ मेल खाता है, लेकिन केवल वर्तमान निर्देशिका में)।
पैट्रिक डार्क

आपका लिंक दूसरे को इंगित करता है rename, जिसमें प्रारूप है rename from to fileऔर नियमित अभिव्यक्ति का समर्थन नहीं करता है। दरअसल, मेरे Linux वितरण (Cent OS 7) में ठीक वैसा ही संस्करण है।
एलेक्स चे

6

यदि फ़ाइलें गंभीर निर्देशिकाओं में हैं, तो नाम ढूंढने के बाद नाम बदलें:

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

-n का नाम बदलने के बाद परीक्षण करना है, इसे आगे बढ़ने के लिए निकालें! -)

इस तरह, आप शक्ति का पता लगाते हैं और उसका नाम बदल देते हैं।

व्यक्तिगत रूप से, मैंने इसका उपयोग स्रोतों के हेडर का नाम बदलने के लिए किया है

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इस कमांड के लिए विशेष रूप से उपयोगी नहीं है।) TL; DR: -inameएक पैटर्न केस से मेल खाता है this असंवेदनशील; -type fमैच "नियमित फ़ाइलें"; और -execजब तक यह एक ;(अर्धविराम) वर्ण का सामना नहीं करता है, एक अभिव्यक्ति निष्पादित करता है ।
पैट्रिक डार्क

5

यह बैश पैरामीटर विस्तार के छोटे जादू के साथ किया जा सकता है!

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

file_[0-9]*_*;- फर्स्ट पैटर्न का उपयोग '' file_anynumber_ '' से शुरू होने वाली सभी फाइलों को गर्त में लाने के लिए किया जाता है
${f#file_[0-9]*_}- दूसरा पैटर्न file_[0-9]*_पैरामीटर विस्तार में उपयोग किया जाता है जो 'file_anynumber_' को स्ट्रिंग की भीख से हटाने के लिए कहता है।

अधिक जानकारी के लिए Parameter expansion:

man bash

ध्यान दें कि यह ग्लब्स का उपयोग करता है, रेगेक्स का नहीं, इसलिए [0-9]*किसी भी स्ट्रिंग के बाद एक अंक से मेल खाएगा। शायद सिर्फ नंबरों से मिलान करने का एक बेहतर तरीका है, लेकिन मैं कुछ भी सोच नहीं सकता।
वेजेंड्रिया

क्या आप इस आदेश को सभी उपनिर्देशिकाओं में पुनरावर्ती रूप से काम करने का एक तरीका सुझा पाएंगे?
फ्रांसेस्को डीएम
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.