जवाबों:
एक साधारण 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//:/-}।
$(echo "$f" | tr ':' '-')साथ की जगह ले सकते हैं "${f//:/-}"और उपधारा, पाइप और बाहरी प्रोग्राम कॉल से बच सकते हैं। मुझे लगता है कि यह बशीवाद है, लेकिन एह। यहाँ देखें ।
मुझे यकीन है कि एक 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
यदि आपके पास बस एक या कुछ फाइलें हैं, तो यह आपके लिए नामकरण कर सकता है:
p="201*" :।old_name=$(ls | grep $p):।स्टोर नया फ़ाइल नाम आवश्यक चरित्र प्रतिस्थापन के साथ:
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/_\./\./')
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
यह ओवरकिल हो सकता है लेकिन आप इस उत्तर में दिए गए लिंक पर स्क्रिप्ट के साथ किसी विशेष वर्ण का नाम बदल सकते हैं:
for f in... लूप एक लूप है जो मौजूदा डायरेक्टरी में उन सभी फाइलों पर निर्भर करता है, जहाँ फाइलों का मिलान करना है*:*। (जो मिलान के साथ होता है?) चाल कमांड एक पुराना पुराना नाम है जो नया नाम है जिसमें नया नाम शेल के साथ निष्पादित किया गया है$( subshell here )। त्र क्या करता है, ...