एकल कमांड में एक उपसर्ग के साथ एक फ़ोल्डर में सभी फ़ाइलों का नाम बदलें


86

उपसर्ग के साथ एक फ़ोल्डर के भीतर सभी फ़ाइलों का नाम बदलें "Unix_"

मान लीजिए कि एक फ़ोल्डर में दो फाइलें हैं

a.txt
b.pdf

फिर उन दोनों को एक ही कमांड से नया नाम दिया जाना चाहिए

Unix_a.txt
Unix_b.pdf

1
इस लिंक की जाँच करें => cyberciti.biz/tips/…
लाल आँखें देव

यहाँ देखें: theunixshell.blogspot.com/2013/01/…
विजय

जवाबों:


107

यदि आपके फ़ाइल नाम में कोई श्वेतपत्र नहीं है और आपके पास कोई उपनिर्देशिका नहीं है, तो आप एक साधारण 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

@Matteo: संकेत का धन्यवाद: एक चेतावनी के साथ मेरे जवाब को अपडेट किया और साथ में दो उदाहरण दिए find
मिकू

इसके अलावा for f in *; do [[ -f ${f} ]] && mv ...; doneकेवल फाइलों (कोई उप-निर्देशिका, लिंक, आदि) को पकड़ने की सिफारिश की जाएगी ...
twalberg

1
यदि आप वैरिएबल को उद्धृत करते हैं, जैसा कि आपको करना चाहिए, तो for FILENAME in *; do mv "$FILENAME" "Unix_$FILENAME"; doneफ़ाइल नामों में वर्णों की परवाह किए बिना सही ढंग से काम करता है। यह निर्देशिकाओं, सॉकेट्स, सिम्लिंक और अन्य फ़ाइल प्रकारों को भी स्थानांतरित करता है; मुझे लगता है कि कोई फर्क नहीं पड़ता।
जोनाथन लेफ़लर

किसी तरह यह .मेरी सभी फ़ाइलों से पहले जोड़ा
nullability 3

75

फ़ाइलों के साथ फ़ोल्डर मेंrename कमांड का प्रयास करें :

rename 's/^/Unix_/' *

नाम बदलने का तर्क ( sed s कमांड ) regex ^ को Unix_ से बदलने का संकेत देता है । कैरेट (^) एक विशेष चरित्र है जिसका अर्थ है लाइन की शुरुआत


8
क्या आप 's/^/.../'इसका मतलब बता सकते हैं ?
20


यह कमाल का है! मैं फ़ोल्डर / * जोड़ने का सुझाव दूंगा, क्योंकि * थोड़ा सा खतरनाक है अगर कमांड को गलती से दूसरी जगह दोहराया जाएगा
सिस्टम Rebooter

शराब की भठ्ठी का नाम बदलकर @OliverPearmain
Felipe Plazas

एक उपसर्ग को बदलने के लिए उदाहरण:rename 's/^start_/run_' *
DenisKolodin

35

मुझे लगता है कि यह वही है जो आप देख रहे हैं:

ls | xargs -I {} mv {} Unix_{}

हाँ, यह सरल अभी तक सुरुचिपूर्ण और शक्तिशाली है, और एक-लाइनर भी है। आप पृष्ठ पर मुझसे अधिक विस्तृत परिचय प्राप्त कर सकते हैं: फ़ाइलें और निर्देशिकाएँ बदलें (उपसर्ग जोड़ें)


2
आउटपुट के प्रसंस्करण से सावधान रहें ls- यदि फ़ाइल के नामों में स्थान या अन्य ऑडबॉल वर्ण हैं तो यह समस्याएँ पैदा कर सकता है।
जोनाथन लेफलर

15

मैंने हाल ही में इसी स्थिति का सामना किया और एक आसान इनबिल्ट समाधान पाया। मैं इसे यहां साझा कर रहा हूं ताकि यह अन्य लोगों को समाधान खोजने में मदद कर सके।

OS X Yosemite के साथ, Apple ने बैच रीनेमिंग क्षमताओं को सीधे फाइंडर में एकीकृत कर दिया है। विवरण की जानकारी यहाँ उपलब्ध है । मैंने नीचे दिए गए चरणों की नकल की है,

कई आइटम का नाम बदलें

  1. आइटम का चयन करें, फिर उनमें से किसी एक को नियंत्रित करें।

  2. शॉर्टकट मेनू में, आइटम का नाम बदलें।

  3. नाम फ़ोल्डर आइटम के नीचे पॉप-अप मेनू में, नामों में पाठ को बदलने, नामों में पाठ जोड़ने या नाम प्रारूप को बदलने का चयन करें।

    • पाठ बदलें: वह फ़ील्ड दर्ज करें जिसे आप फ़ील्ड में निकालना चाहते हैं, फिर वह टेक्स्ट दर्ज करें जिसे आप "फ़ील्ड से बदलें" फ़ील्ड में जोड़ना चाहते हैं।

    • टेक्स्ट जोड़ें: फ़ील्ड में वह टेक्स्ट दर्ज करें जिसे आप जोड़ना चाहते हैं, फिर वर्तमान नाम से पहले या बाद में टेक्स्ट को जोड़ना चुनें।

    • स्वरूप: फ़ाइलों के लिए एक नाम प्रारूप चुनें, फिर नाम के पहले या बाद में सूचकांक, काउंटर, या तारीख डालना चुनें। कस्टम प्रारूप फ़ील्ड में एक नाम दर्ज करें, फिर उस संख्या को दर्ज करें जिसे आप शुरू करना चाहते हैं।

  4. नाम बदलें पर क्लिक करें।

यदि आपकी फ़ाइलों में आपके पास एक सामान्य पैटर्न है तो आप रिप्लेसमेंट टेक्स्ट का उपयोग कर सकते हैं अन्यथा एड टेक्स्ट भी काम करेगा।


बहुत बढ़िया - मुझे बहुत समय बचा लिया!
user3000868

6

आप -iइसके बजाय बस का उपयोग कर सकते हैं-I {}

ls | xargs -i mv {} unix_{}

यह भी पूरी तरह से काम करता है।

  • ls - निर्देशिका में सभी फाइलों को सूचीबद्ध करता है
  • xargs- -iविकल्प के कारण सभी फाइलों को लाइन से स्वीकार करता है
  • {}सभी फ़ाइलों के लिए प्लेसहोल्डर है, यदि xargsइनपुट के रूप में दो से अधिक तर्क मिलते हैं

Awk का उपयोग करना:

ls -lrt | grep '^-' | awk '{print "mv "$9" unix_"$9""}' | sh

-iपदावनत किया जाता है, अब बस है-I
JamPow

इसने डेबियन 8.Thaks
Abror Esonaliyev

2

इसके अलावा रिक्त स्थान और उपेक्षा निर्देशिका के साथ आइटम के लिए काम करता है

for f in *; do [[ -f "$f" ]] && mv "$f" "unix_$f"; done

1

Rnm के साथ (आपको इसे स्थापित करने की आवश्यकता होगी):

rnm -ns 'Unix_/fn/' *

या

rnm -rs '/^/Unix_/' *

पुनश्च: मैं इस उपकरण का लेखक हूं।


2
आपको अपनी उपयोगिता के बारे में अपने सभी उत्तरों के माध्यम से जाना चाहिए, और इस अस्वीकरण को जोड़ना चाहिए कि आप इसके लेखक हैं।
मोगादाद

@Mogsdad: मुझे नहीं लगता कि इसकी एक आवश्यक जानकारी है। अगर कोई लेखक को खोजना चाहता है, तो यह बहुत आसान है।
जाहिद

इस उपकरण के लिए धन्यवाद। किसी कारण से, renameमेरे लिए काम नहीं करता है, लेकिन rnmकरता है।
अल्साओ

0

परिस्थिति:

हमारे 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निर्देशिका में बेहतर है और इसे वहां करें। खुद जोखिम पर उपयोग करें।


0

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 पर निष्पादित करने से पहले निर्देशिका में है।

मैंने इसे और अधिक विस्तार से समझाया है: एकाधिक फ़ाइलों को ढूंढें और उन्हें लिनक्स में नाम बदलें

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.