उपसर्ग के साथ एक फ़ोल्डर के भीतर सभी फ़ाइलों का नाम बदलें "Unix_"
मान लीजिए कि एक फ़ोल्डर में दो फाइलें हैं
a.txt
b.pdf
फिर उन दोनों को एक ही कमांड से नया नाम दिया जाना चाहिए
Unix_a.txt
Unix_b.pdf
उपसर्ग के साथ एक फ़ोल्डर के भीतर सभी फ़ाइलों का नाम बदलें "Unix_"
मान लीजिए कि एक फ़ोल्डर में दो फाइलें हैं
a.txt
b.pdf
फिर उन दोनों को एक ही कमांड से नया नाम दिया जाना चाहिए
Unix_a.txt
Unix_b.pdf
जवाबों:
यदि आपके फ़ाइल नाम में कोई श्वेतपत्र नहीं है और आपके पास कोई उपनिर्देशिका नहीं है, तो आप एक साधारण for
लूप का उपयोग कर सकते हैं :
$ for FILENAME in *; do mv $FILENAME Unix_$FILENAME; done
अन्यथा सुविधाजनक rename
कमांड का उपयोग करें (जो एक पर्ल स्क्रिप्ट है) - हालांकि यह हर यूनिक्स पर बॉक्स से बाहर उपलब्ध नहीं हो सकता है (उदाहरण के लिए ओएस एक्स के साथ नहीं आता है rename
)।
Debian-administration.org पर एक संक्षिप्त अवलोकन:
यदि आपके फ़ाइल नाम में व्हाट्सएप है तो इसका उपयोग करना आसान है find
, लिनक्स पर निम्नलिखित काम करना चाहिए:
$ find . -type f -name '*' -printf "echo mv '%h/%f' '%h/Unix_%f\n'" | sh
बीएसडी सिस्टम पर -printf
, दुर्भाग्य से कोई विकल्प नहीं है । लेकिन GNU फाइंड्यूटिल को इंस्टाल करने योग्य होना चाहिए (उदाहरण के लिए Mac OS X के साथ brew install findutils
)।
$ gfind . -type f -name '*' -printf "mv \"%h/%f\" \"%h/Unix_%f\"\n" | sh
find
।
for f in *; do [[ -f ${f} ]] && mv ...; done
केवल फाइलों (कोई उप-निर्देशिका, लिंक, आदि) को पकड़ने की सिफारिश की जाएगी ...
for FILENAME in *; do mv "$FILENAME" "Unix_$FILENAME"; done
फ़ाइल नामों में वर्णों की परवाह किए बिना सही ढंग से काम करता है। यह निर्देशिकाओं, सॉकेट्स, सिम्लिंक और अन्य फ़ाइल प्रकारों को भी स्थानांतरित करता है; मुझे लगता है कि कोई फर्क नहीं पड़ता।
.
मेरी सभी फ़ाइलों से पहले जोड़ा
फ़ाइलों के साथ फ़ोल्डर मेंrename
कमांड का प्रयास करें :
rename 's/^/Unix_/' *
नाम बदलने का तर्क ( sed s कमांड ) regex ^ को Unix_ से बदलने का संकेत देता है । कैरेट (^) एक विशेष चरित्र है जिसका अर्थ है लाइन की शुरुआत ।
's/^/.../'
इसका मतलब बता सकते हैं ?
's/^/.../'
का नाम बदलकर कमांड के
rename 's/^start_/run_' *
मुझे लगता है कि यह वही है जो आप देख रहे हैं:
ls | xargs -I {} mv {} Unix_{}
हाँ, यह सरल अभी तक सुरुचिपूर्ण और शक्तिशाली है, और एक-लाइनर भी है। आप पृष्ठ पर मुझसे अधिक विस्तृत परिचय प्राप्त कर सकते हैं: फ़ाइलें और निर्देशिकाएँ बदलें (उपसर्ग जोड़ें)
ls
- यदि फ़ाइल के नामों में स्थान या अन्य ऑडबॉल वर्ण हैं तो यह समस्याएँ पैदा कर सकता है।
मैंने हाल ही में इसी स्थिति का सामना किया और एक आसान इनबिल्ट समाधान पाया। मैं इसे यहां साझा कर रहा हूं ताकि यह अन्य लोगों को समाधान खोजने में मदद कर सके।
OS X Yosemite के साथ, Apple ने बैच रीनेमिंग क्षमताओं को सीधे फाइंडर में एकीकृत कर दिया है। विवरण की जानकारी यहाँ उपलब्ध है । मैंने नीचे दिए गए चरणों की नकल की है,
कई आइटम का नाम बदलें
आइटम का चयन करें, फिर उनमें से किसी एक को नियंत्रित करें।
शॉर्टकट मेनू में, आइटम का नाम बदलें।
नाम फ़ोल्डर आइटम के नीचे पॉप-अप मेनू में, नामों में पाठ को बदलने, नामों में पाठ जोड़ने या नाम प्रारूप को बदलने का चयन करें।
पाठ बदलें: वह फ़ील्ड दर्ज करें जिसे आप फ़ील्ड में निकालना चाहते हैं, फिर वह टेक्स्ट दर्ज करें जिसे आप "फ़ील्ड से बदलें" फ़ील्ड में जोड़ना चाहते हैं।
टेक्स्ट जोड़ें: फ़ील्ड में वह टेक्स्ट दर्ज करें जिसे आप जोड़ना चाहते हैं, फिर वर्तमान नाम से पहले या बाद में टेक्स्ट को जोड़ना चुनें।
स्वरूप: फ़ाइलों के लिए एक नाम प्रारूप चुनें, फिर नाम के पहले या बाद में सूचकांक, काउंटर, या तारीख डालना चुनें। कस्टम प्रारूप फ़ील्ड में एक नाम दर्ज करें, फिर उस संख्या को दर्ज करें जिसे आप शुरू करना चाहते हैं।
नाम बदलें पर क्लिक करें।
यदि आपकी फ़ाइलों में आपके पास एक सामान्य पैटर्न है तो आप रिप्लेसमेंट टेक्स्ट का उपयोग कर सकते हैं अन्यथा एड टेक्स्ट भी काम करेगा।
आप -i
इसके बजाय बस का उपयोग कर सकते हैं-I {}
ls | xargs -i mv {} unix_{}
यह भी पूरी तरह से काम करता है।
ls
- निर्देशिका में सभी फाइलों को सूचीबद्ध करता हैxargs
- -i
विकल्प के कारण सभी फाइलों को लाइन से स्वीकार करता है{}
सभी फ़ाइलों के लिए प्लेसहोल्डर है, यदि xargs
इनपुट के रूप में दो से अधिक तर्क मिलते हैंAwk का उपयोग करना:
ls -lrt | grep '^-' | awk '{print "mv "$9" unix_"$9""}' | sh
-i
पदावनत किया जाता है, अब बस है-I
इसके अलावा रिक्त स्थान और उपेक्षा निर्देशिका के साथ आइटम के लिए काम करता है
for f in *; do [[ -f "$f" ]] && mv "$f" "unix_$f"; done
Rnm के साथ (आपको इसे स्थापित करने की आवश्यकता होगी):
rnm -ns 'Unix_/fn/' *
या
rnm -rs '/^/Unix_/' *
पुनश्च: मैं इस उपकरण का लेखक हूं।
rename
मेरे लिए काम नहीं करता है, लेकिन rnm
करता है।
परिस्थिति:
हमारे certificate.key
certificate.crt
अंदर है/user/ssl/
हम ऐसी किसी भी चीज़ का नाम बदलना चाहते हैं जो इसके साथ शुरू होती certificate
हैcertificate_OLD
अब हम अंदर स्थित हैं /user
सबसे पहले, आप के साथ एक सूखी रन करते हैं -n
:
rename -n "s/certificate/certificate_old/" ./ssl/*
कौन सा रिटर्न:
rename(./ssl/certificate.crt, ./ssl/certificate_OLD.crt)
rename(./ssl/certificate.key, ./ssl/certificate_OLD.key)
आपकी फ़ाइलें अपरिवर्तित रहेंगी यह केवल एक परीक्षण रन है।
समाधान:
जब परीक्षण के परिणाम से आपका खुश असली के लिए इसे चलाता है:
rename "s/certificate/certificate_OLD/" ./ssl/*
इसका क्या मतलब है:
`का नाम बदलें / SOMETHING / SOMETING_ELSE" पथ / फ़ाइलें
सुझाव:
यदि आप पहले से ही पथ पर हैं तो इसे इस तरह से चलाएं:
rename "s/certificate/certificate_OLD/" *
या यदि आप इसे किसी भी उप-निर्देशिका में करना चाहते हैं, जो करना शुरू करते ss
हैं:
rename -n "s/certificat/certificate_old/" ./ss*/*
आप भी कर सकते हैं:
rename -n "s/certi*/certificate_old/" ./ss*/*
जो certi
किसी भी उप-निर्देशिका से शुरू होने वाली किसी भी चीज़ का नाम बदल देता है ss
।
बस, अब बहुत हो चुका।
रेगेक्स और ALWAYS के साथ इस BEFORE का परीक्षण करें -n
।
इस मैच को देखने के बाद आप इस मैच को देख सकते हैं। cd
निर्देशिका में बेहतर है और इसे वहां करें। खुद जोखिम पर उपयोग करें।
find -execdir rename
यह केवल बेसनैम को प्रभावित करने वाली एक नियमित अभिव्यक्ति के साथ फ़ाइलों और निर्देशिकाओं का नाम बदलता है।
तो आप कर सकते हैं एक उपसर्ग के लिए:
PATH=/usr/bin find . -depth -execdir rename 's/^/Unix_/' '{}' \;
या केवल फ़ाइलों को प्रभावित करने के लिए:
PATH=/usr/bin find . -type f -execdir rename 's/^/Unix_/' '{}' \;
-execdir
पहले cd
केवल basename पर निष्पादित करने से पहले निर्देशिका में है।
मैंने इसे और अधिक विस्तार से समझाया है: एकाधिक फ़ाइलों को ढूंढें और उन्हें लिनक्स में नाम बदलें