फ़ाइलों का नाम बदलने के दौरान रिक्त स्थान बदलने से बचें


10

मैं इस तरह फ़ाइलों का नाम बदलने की कोशिश कर रहा हूँ:

for file in *;
do
mv -i "$file" "$(echo "$file" | sed -e 's/[^A-Za-z0-9._-]/_/g')";
done

लेकिन sedकमांड सभी जगहों को बदल देता है _

मैं sedनिर्दिष्ट वर्णों के साथ इसे इनक्लूड स्पेस बनाने के लिए कमांड को कैसे संपादित कर सकता हूं ? मैं प्रयोग करने की कोशिश की है, \sलेकिन यह काम नहीं करता है ...

संपादित करें:
उदाहरण के लिए: फ़ाइल का trip: hillनाम बदला जाना चाहिए: trip_ hillलेकिन ऊपर दिया गया आदेश इसे बनाता है trip__hill


मैं लिनक्स से कुछ फ़ाइलों को स्थानांतरित कर रहा हूँ, मैक के लिए। लेकिन किसी कारण से मैक सिस्टम सभी फ़ाइल नामों को नहीं पढ़ सकता है, इसलिए मैं अपनी फ़ाइलों का नाम बदलने की कोशिश कर रहा हूं। ऊपर दिए गए कमांड में स्थान जोड़ने से काम नहीं चलता है। और आप सही हैं: मैं निर्दिष्ट किए गए को छोड़कर सभी वर्णों को '_' से बदलना चाहता हूं। और मुझे नहीं पता कि अंतरिक्ष चार को कैसे शामिल किया जाए।

कृपया ध्यान दें कि मैं निर्दिष्ट किए गए को छोड़कर सभी वर्णों को '_' से बदलने का प्रयास कर रहा हूं। फ़ाइलों का नाम बदलने के लिए कोई विशेष पैटर्न नहीं है, इसलिए मैं इस पर्ल कमांड का उपयोग नहीं कर सकता।

जवाबों:


11

फिलानेवालों के साथ पार्स न करें sed! उत्पादन echo "$file"विश्वसनीय नहीं हो सकता है।

का उपयोग करें rename। 17.10 पर आपको इसे पहले इंस्टॉल करना होगा

sudo apt install rename

फिर:

rename -n -- 's/[^-A-Za-z0-9_ .]/_/g' *

टिप्पणियाँ

  • -nवास्तव में फ़ाइलों का नाम बदलने के लिए परीक्षण के बाद हटा दें
  • -- किसी भी फ़ाइल के साथ शुरू होने की स्थिति में अंतिम विकल्प -
  • [^-A-Za-z0-9_ .]-जिन वर्णों को हम बदलना नहीं चाहते - पहले या अंतिम स्थान पर रखें ताकि यह एक सीमा को इंगित न कर सके (इसका इन पदों पर अक्षरशः व्यवहार किया जाता है)।
  • रिक्त स्थान को कक्षा में शामिल किया जा सकता है
  • . वस्तुतः व्यवहार किया जाता है (अन्य रेगेक्स संदर्भों में यह किसी भी चरित्र के लिए खड़ा है और बच निकलने की आवश्यकता है)।

यह भी इसमें काम करता है sed:

$ echo 'trip: hill' | sed 's/[^-A-Za-z0-9 _.]/_/g'
trip_ hill

यदि मैं आपके संस्करण में अंत में एक स्थान जोड़ता हूं, तो मुझे एक त्रुटि मिलती है:

$ echo 'trip: hill' | sed -e 's/[^A-Za-z0-9._- ]/_/g'
sed: -e expression #1, char 22: Invalid range end

लेकिन -अंत में, यह काम करता है:

$ echo 'trip: hill' | sed -e 's/[^A-Za-z0-9._ -]/_/g'
trip_ hill

तो शायद हाइपेन की स्थिति आपकी समस्या का कारण बनी जब आपने अंतरिक्ष को जोड़ा। लेकिन फ़ाइल नाम रखने के लिए सलाह नहीं!


यह कमांड काम करता है धन्यवाद। आपके द्वारा उपयोग की गई कमांड में गलतियों को भी आपने स्पष्ट रूप से पहचान लिया है।

2
फिर से धन्यवाद। कृपया ध्यान दें कि sed का उपयोग करने के मामले में फॉरवर्ड स्लैश '\' का उपयोग करने की कोई आवश्यकता नहीं है। क्योंकि यह अनदेखा वर्णों की सूची में '\' जोड़ता है।

2
@ लाटच यह एक बैकस्लैश है, लेकिन आप बिल्कुल सही हैं। परीक्षण और खुदाई के बाद मैंने पाया कि .एक चरित्र वर्ग में शाब्दिक है। टीआईएल!
ज़न्ना

2

तुम भी सिर्फ खोल का उपयोग कर सकते हैं, बाश के पैरामीटर विस्तार प्रतिस्थापन कर सकते हैं:

for f in ./* ; do
    mv "$f" "${f//[^-A-Za-z0-9._ ]/_}"
done

डबल स्लैश इसे सभी मैचों को बदलने के लिए कहता है, इसके अलावा, सिंटैक्स सीधा है।

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