फ़ाइलों का नाम बदलें और वर्णों को कैसे बदलें?


11

मेरे पास फ़ाइलों का एक समूह है :जो नाम के भीतर (कोलन) है। मुझे (डैश) के :साथ प्रतिस्थापित करने की आवश्यकता है -

क्या स्क्रिप्ट में ऐसा करने का कोई आसान तरीका है?

नमूना फ़ाइल का नाम: 2013-10-11:11:52:08_055456663_045585_.txt

जवाबों:


17

एक साधारण 1-लाइनर को करना चाहिए (पॉज़िक्स- shअसंगत शेल को मानता है ):

for f in *:*; do mv -v "$f" $(echo "$f" | tr ':' '-'); done

स्पष्टीकरण:

  • for ... in ...; do ...; doneएक पाश है

  • *:* वर्तमान निर्देशिका में सभी फ़ाइलों और निर्देशिकाओं से मेल खाता है जो :उनके नाम में है

  • f लूप में ऐसे प्रत्येक फ़ाइल नाम के बदले में असाइन किया गया है

  • mvइसके पहले तर्क का दूसरा नाम बदल जाता है; -v(क्रिया) यह प्रिंट करने के लिए कहता है कि यह क्या करता है; यह विकल्प GNU-utils विशिष्ट है, इसलिए यह लिनक्स पर उपलब्ध है, लेकिन सोलारिस नहीं

  • $(...) उप-शेल में कोड निष्पादित करता है और आउटपुट को प्रतिस्थापित करता है

  • echo अपने तर्क को मानक आउटपुट पर प्रिंट करता है

  • tr मानक आउटपुट पढ़ता है और आपूर्ति किए गए नक्शे के अनुसार वर्णों का अनुवाद करता है

यदि आप बैश का उपयोग कर रहे हैं , तो आप एक अतिरिक्त शेल ( $()) को उप-प्रक्रियाओं ( tr) के $(...)साथ बदलकर स्पॉनिंग से बच सकते हैं ${f//:/-}


एक साधारण काम के जवाब के लिए +1, हालांकि यह थोड़ा और स्पष्टीकरण के साथ कर सकता है। उदाहरण के लिए for f in... लूप एक लूप है जो मौजूदा डायरेक्टरी में उन सभी फाइलों पर निर्भर करता है, जहाँ फाइलों का मिलान करना है *:*। (जो मिलान के साथ होता है?) चाल कमांड एक पुराना पुराना नाम है जो नया नाम है जिसमें नया नाम शेल के साथ निष्पादित किया गया है $( subshell here )। त्र क्या करता है, ...
हेन्नेस

@Hennes: इस है सुपर उपयोगकर्ता - मैं वास्तव में विवरण की इन प्रकार में जाने की जरूरत है? ओह ठीक है, यहाँ तुम जाओ ...
sds

नहीं, अगर वास्तविक जरूरत होती तो मैं + 1'द नहीं होता। और मैं समझता हूं कि यह क्या करता है। मुझे लगता है कि यह कई अन्य पाठकों के लिए अच्छा है।
हेनस

2
आप के $(echo "$f" | tr ':' '-')साथ की जगह ले सकते हैं "${f//:/-}"और उपधारा, पाइप और बाहरी प्रोग्राम कॉल से बच सकते हैं। मुझे लगता है कि यह बशीवाद है, लेकिन एह। यहाँ देखें
evilsoup

@evilsoup वास्तव में; यह छोटे डेटा सेट (और पठनीयता के पक्ष में हो सकता है) के लिए बहुत अंतर नहीं करता है, लेकिन आप आश्चर्यचकित होंगे कि ऐसा कुछ कैसे तेजी से बढ़ता है। मुझे हाल ही में इसके द्वारा थोड़ा सा मिला; एक स्क्रिप्ट को फिर से लिखना जैसे कि दो सरल स्ट्रिंग मालिश आदेशों को अब आवश्यक रूप से आसानी से निष्पादन समय में 90% या उससे अधिक की कटौती नहीं की गई थी, जो कि एक बड़े डेटा सेट पर कई मिनट के वॉलकॉक रन टाइम के लिए अनुवाद किया गया था।
बजे एक CVn

6

जैसा कि मेरे द्वारा एक अन्य पोस्ट में कहा गया है कि renameटूल आपके लिए ट्रिक कर सकता है। आपको बस टाइप करना है rename s/:/-/ <files to rename> यह प्रत्येक कोलोन को आपके द्वारा अंत में नामित सभी फाइलों में डैश के साथ बदल देता है, अर्थात2013-10-*

यहाँ मेरी अन्य पोस्ट की लिंक है


1

मुझे यकीन है कि एक UNIX समर्थक इसे bash के साथ कर सकता है, लेकिन यहां माणिक के साथ मेरा त्वरित और गंदा संस्करण है।

path_to_files = "/home/username/wrongnames/"
filenames = `ls #{path_to_files}`.split
filenames.each do |fn|
  `mv #{path_to_files + fn} #{path_to_files + fn.gsub(/:/, "-")}`
end

अपनी गलत फ़ाइलों के पथ पर path_to_files सेट करें। ऊपर दिए गए कोड को rename.rb नामक फ़ाइल में सहेजें:

username@machinename$ ruby rename.rb

@ sds एक बेहतर उत्तर प्रदान करता है। क्या मुझे अपना उत्तर हटा देना चाहिए? मैं stackoverflow के लिए नया हूँ।
शुप्रू

1
नहीं; यह अभी भी महत्वपूर्ण मूल्य है। :)
ब्लैकलाइट शाइनिंग

2
इस उत्तर के साथ कुछ प्रमुख डाउनसाइड हैं, हालांकि, यह प्रासंगिक हो सकता है और निश्चित रूप से इसके बारे में जानने लायक है। (यह अभी भी उपयोगी हो सकता है, लेकिन कैविटी एमप्टर और वह सब।) मुख्य रूप से, ऐसा लगता है कि यह बुरी तरह से टूट जाएगा जब यह सफेद स्थान (न केवल क्लासिक विफलता केस न्यूलाइन) के साथ नाम दर्ज करता है। इसके अलावा, यहां तक ​​कि अगर यह सफेद स्थान के लिए नहीं था, तो आपको शेल द्वारा उपचार में फ़ाइल नामों में किसी अन्य विशेष वर्ण की रक्षा करने के लिए शेल इनवोकेशन में फ़ाइल नाम को उद्धृत करना चाहिए (हालांकि मुझे नहीं पता कि रूबी का बैकटिक ऑपरेटर कैसे काम करता है )।
बजे एक CVn

1

यदि आपके पास बस एक या कुछ फाइलें हैं, तो यह आपके लिए नामकरण कर सकता है:

  1. एक चर के रूप में आपके द्वारा लक्षित फ़ाइल नाम के पैटर्न को संग्रहीत करें: p="201*" :।
  2. उस पुराने फ़ाइल नाम को संग्रहीत करें जिसका आप नाम बदलना चाहते हैं old_name=$(ls | grep $p):।
  3. स्टोर नया फ़ाइल नाम आवश्यक चरित्र प्रतिस्थापन के साथ:

    new_name=$(ls | grep $p | sed 's/:/_/g')        # Using 'sed'
    
                OR
    
    new_name=$(ls | grep $p | tr ':' '_')           # Using 'tr'
    

बोनस की सफाई :
  ए। यदि एकरूपता के लिए आप कॉलोन (-) के साथडैश(:) को अंडरस्कोर (_)से बदलना चाहते हैं, तो आप ऐसा कर सकते हैं:

    new_name=$(ls | grep $p | tr ':-' '_');

  ख। यदि आप अंतिम अंडरस्कोर चाहते हैं (बस इससे पहले .txt) चले गए, तो new_nameचर को निम्नानुसार सेट करें:

    new_name=$(ls | grep $p | tr ':-' '_' | sed 's/_\./\./')
  1. अब आवश्यकतानुसार अपनी फ़ाइल का नाम बदलें: mv $old_name $new_name

         NB: mvयदि नाम बदलने की कार्रवाई में कोई भी फ़ाइल नाम इसमें है तो विफल हो जाएगा spaces। उस स्थिति में, उपयुक्त चर को उद्धरणों में लपेटें, जैसे:
mv "$old_name" $new_name OR mv $old_name "$new_name" OR mv "$old_name" "$new_name"


एक-लाइनर्स

1a: p="201*"; old_name=$(ls | grep $p); new_name=$(ls | grep $p | sed 's/:/_/g'); mv $old_name $new_name

1b: p="201*"; old_name=$(ls | grep $p); new_name=$(ls | grep $p | tr ':' '_'); mv $old_name $new_name

2: p="201*"; old_name=$(ls | grep $p); new_name=$(ls | grep $p | tr ':-' '_'); mv $old_name $new_name

3: p="201*"; old_name=$(ls | grep $p); new_name=$(ls | grep $p | tr ':-' '_' | sed 's/_\./\./'); mv $old_name $new_name

0

रेनमर का उपयोग करना :

$ renamer --find ":" --replace "-" *

मुझे लगता है कि सिर्फ फाइलों का नाम बदलने के लिए एक पूर्ण नोड.जेएस वातावरण स्थापित करना थोड़ा बहुत है। renameएक उपकरण है जो कई लिनक्स वितरण पर पूर्वस्थापित है। लेकिन मुझे लगता है कि विंडोज के लिए यह टूल बहुत अच्छा हो सकता है।
noggerl

0

यह ओवरकिल हो सकता है लेकिन आप इस उत्तर में दिए गए लिंक पर स्क्रिप्ट के साथ किसी विशेष वर्ण का नाम बदल सकते हैं:

/superuser//a/858671/365691

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