नाम दर्ज करने के लिए पाठ को कैसे बढ़ाएँ?


44

आइए बताते हैं कि मेरे पास .mdफाइलों से भरी एक निर्देशिका है, जिसमें विभिन्न चीजों के नाम हैं। कहते हैं कि मैं प्रत्येक फ़ाइल नाम के सामने "पाठ" प्रस्तुत करना चाहता था। उदाहरण के लिए: फ़ाइल a.md, b.mdऔर c.mdबन जाएगा test - a.md, test - b.mdऔर test - c.md

मैं इसे कमांड लाइन के माध्यम से कैसे पूरा करूंगा?

जवाबों:


60

वन-लाइनर जिसे आसानी से सीधे टर्मिनल से टाइप किया जा सकता है:

for f in *.md; do mv "$f" "test - $f"; done

या अर्धविरामों का उपयोग करने के बजाय अलग-अलग लाइनों पर फिर से लिखा गया:

for f in *.md
do
    mv "$f" "test - $f"
done

प्रदर्शनी

सिंटैक्स for(में sh):

for NAME [in WORDS ... ] ; do COMMANDS; done

इधर, हमारे NAMEहै fऔर हमारे WORDSवर्तमान निर्देशिका मिलान में सभी फाइलों रहे हैं *.md। इसलिए चर $fको प्रत्येक फ़ाइल मिलान के साथ प्रतिस्थापित किया जाएगा *.md

तो इसके लिए a.md:

mv "$f" "test - $f"

हो जाता है

mv "a.md" "test - a.md"

उद्धरण महत्वपूर्ण हैं क्योंकि प्रत्येक फ़ाइल नाम $fमें स्थान हो सकते हैं। अन्यथा mvप्रत्येक शब्द एक अलग फ़ाइल होती। उदाहरण के लिए, यदि कोई उद्धरण नहीं था, और एक फ़ाइल है Foo Bar.md, जिसे यह कहा जाएगा:

mv Foo Bar.md test - Foo Bar.md

जो इरादा के रूप में काम नहीं करेगा। लेकिन $fउद्धरण में लपेटकर , यह समझ में आता है:

mv "Foo Bar.md" "test - Foo Bar.md"

के सिंटैक्स को ध्यान में रखते हुए for, आप *.mdस्पष्ट रूप से नामकरण करके सभी फाइलों के एक सबसेट का नाम बदल सकते हैं :

for f in a.md b.md d.md; do mv "$f" "Test - $f"; done

या शेल विस्तार का उपयोग करना:

for f in {a,b,d}.md; do mv "$f" "Test - $f"; done

यह वही है जो मुझे देखने की जरूरत थी। धन्यवाद!
रयान

11

यदि आपके पास prename...

prename 's/^/test - /' *.md

साधारण शेल कमांड का उपयोग करना:

for file in *.md; do
    mv "$file" "test - $file"
done

मुझे कैसे मिलेगा prename?
Ga

मेरे लिए Ubuntu 16.04 LTS पर प्रीइंस्टॉल्ड लगता है। क्या आपने अपना पैकेज मैनेजर (यानी sudo apt-get install?) आज़माया है ?
ओरियन 751

5

mmv1 , 2 भी इस तरह के कार्य के लिए एक बहुत अच्छा उपकरण है, जिसे वर्तमान नौकरी में लागू किया जाता है

mmv '*.md' 'test - #1.md'

बेशक, यदि आप केवल "परीक्षण -" को a.md, b.md और c.md में जोड़ना चाहते हैं, लेकिन a1.md नहीं, तो कुछ ऐसा

mmv '?.md' 'test - #1.md'

अधिक उचित होगा।

मैं वास्तव में इसका सुझाव दे सकता हूं, खासकर यदि आपको ऐसी कई समस्याएं हैं।

यदि आप अतिरिक्त ग्राफिकल इंटरफ़ेस की तलाश कर रहे हैं, तो gprename आज़माएँ


5

लूप के लिए उपयोग करने के बजाय, जो रिक्त स्थान पर विफल हो जाएगा जब तक कि आप IFS चर को फिर से परिभाषित नहीं करते हैं, मैं खोज के साथ संयुक्त लूप का उपयोग करने की सलाह दूंगा। फ़ाइलों के रूप में समान निर्देशिका से चलाने पर निम्नलिखित कार्य करेगा

find . -maxdepth 1 -type f -name '*.md' | while read -r file; do
    file=$(basename $file)
    mv "$file" "test - $file"
done

"बेसनेम" लाइन वहाँ है ताकि खोज केवल फ़ाइल नाम को प्रिंट करेगी - पथ के घटकों के बिना जो नाम बदलने के ऑपरेशन को तोड़ देगा।


2

मुझे पता है कि यह वास्तव में देर हो चुकी है, लेकिन अगर किसी और को इस तरह की चीज की तलाश है, तो यह मेरे लिए काम करता है:

rename '' 'name -' *.md

1
सरल और सीधे आगे
user13743

0

यदि आपके पास zshउपलब्ध है तो आप उपयोग कर सकते हैं zmv:

autoload zmv
zmv -w '*' 'test - $1'

आप के साथ कमांड का परीक्षण कर सकते हैं:

zmv -wn '*' 'test - $1'
  • -n शुष्क-रन का मतलब है, केवल यह दिखाओ कि क्या होगा।
  • -w निहितार्थ वाइल्डकार्ड के आसपास कोष्ठक डालता है, बैकरेफरेंस काम करता है।

0

फ़ोल्डर में सभी फ़ाइलों में "Prepend text -" जोड़कर bash में:

for i in *; do mv "$i" "$(echo $i | sed 's/^/Prepend\ text\ \-\ /')"; done;

यह लिखने का एक सुपर-लंबा तरीका हैfor i in *; do mv "$i$" "Prepend text - $i"; done
डेविड रिचरबी
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.