सवाल फ़ाइल नाम से अमान्य वर्णों को कैसे हटाएं?


मेरे पास इस तरह के अमान्य वर्णों वाली फ़ाइलें हैं

009_-_�%86ndringshåndtering.html

यह है एक Æ जहां फ़ाइल नाम में कुछ गलत हो गया है।

क्या सभी अमान्य वर्णों को हटाने का कोई तरीका है?

या कर सकता था tr किसी भी तरह इस्तेमाल किया जा सकता है?

echo "009_-_�%86ndringshåndtering.html" | tr ???

40
2018-01-10 14:07


मूल


पात्र शायद "अमान्य" नहीं हैं, अन्यथा फाइल सिस्टम उन्हें स्टोर नहीं करेगा (जब तक कि आपने कुछ नहीं किया वास्तव में एफएस के लिए बुरा)। क्या आपने नामों को सही तरीके से प्रदर्शित करने के लिए अपना लोकेल (उदा। यूटीएफ 8) बदलने की कोशिश की है? - James O'Gorman


जवाब:


एक रास्ता sed के साथ होगा:

mv 'file' $(echo 'file' | sed -e 's/[^A-Za-z0-9._-]/_/g')

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


37
2018-01-10 14:22



मैंनें इस्तेमाल किया: f='file'; mv 'file' ${f//[^A-Za-z0-9._-]/_} - Louis


मुझे लगता है कि आप लिनक्स बॉक्स पर हैं और फाइलें विंडोज बॉक्स पर बनाई गई थीं। लिनक्स यूटीएफ -8 का उपयोग फाइलनामों के लिए अक्षर एन्कोडिंग के रूप में करता है, जबकि विंडोज कुछ और उपयोग करता है। मुझे लगता है कि यह समस्या का कारण है।

मैं "convmv" का उपयोग करेंगे। यह एक ऐसा उपकरण है जो फ़ाइल नामों को एक वर्ण एन्कोडिंग से दूसरे में परिवर्तित कर सकता है। पश्चिमी यूरोप के लिए इनमें से एक सामान्य रूप से काम करता है:

convmv -r -f windows-1252 -t UTF-8 .
convmv -r -f ISO-8859-1 -t UTF-8 .
convmv -r -f cp-850 -t UTF-8 .

यदि आपको इसे डेबियन आधारित लिनक्स पर स्थापित करने की आवश्यकता है तो आप इसे चलाकर ऐसा कर सकते हैं:

sudo apt-get install convmv

यह हर बार मेरे लिए काम करता है और यह मूल फ़ाइल नाम पुनर्प्राप्त करता है।

स्रोत: LeaseWebLabs


28
2017-12-25 00:23



यह आशाजनक लग रहा है, लेकिन कोई विचार यह है कि एन्कोडिंग क्या है? मेरे पास एक निर्देशिका है Save the current file in Word 97-2004 format\sco.workflow जो मेरे मैक (माइक्रोसॉफ्ट ऑफिस के माध्यम से) पर बनाया गया है और उपरोक्त एन्कोडिंग का कोई प्रभाव नहीं है। - Sridhar-Sarnobat


मुझे लगता है कि आप फाइल सिस्टम को पार करना चाहते हैं और ऐसी सभी फाइलों को ठीक करना चाहते हैं?

यहां मैं जिस तरह से करूँगा

find /path/to/files -type f -print0 | \
perl -n0e '$new = $_; if($new =~ s/[^[:ascii:]]/_/g) {
  print("Renaming $_ to $new\n"); rename($_, $new);
}'

उन सभी फ़ाइलों को गैर-असीसी वर्णों के साथ मिल जाएगा और उन पात्रों को अंडरस्कोर के साथ प्रतिस्थापित करें (_)। हालांकि सावधानी बरतें, अगर नए नाम वाली फ़ाइल पहले से मौजूद है, तो यह इसे ओवरराइट कर देगी। इस तरह के मामले की जांच के लिए स्क्रिप्ट को संशोधित किया जा सकता है, लेकिन मैंने इसे सरल रखने के लिए इसे नहीं रखा है।


15
2018-01-10 14:41





उत्तर के बाद https://stackoverflow.com/questions/2124010/grep-regex-to-match-non-ascii-characters, आप उपयोग कर सकते हैं:

rename 's/[^\x00-\x7F]//g' *

कहा पे * उन फ़ाइलों से मेल खाता है जिन्हें आप पुनर्नामित करना चाहते हैं। यदि आप इसे एकाधिक निर्देशिकाओं पर करना चाहते हैं, तो आप कुछ ऐसा कर सकते हैं:

find . -exec rename 's/[^\x00-\x7F]//g' "{}" \;

आप -n तर्क का उपयोग कर सकते हैं rename एक सूखी दौड़ करने के लिए, और इसे बदलने के बिना क्या बदला जाएगा, देखें।


11
2018-05-25 10:52



उदाहरण के लिए ü और ä जैसे विदेशी वर्ण रखने के लिए इसे संशोधित करने का कोई तरीका है? - Elder Geek
केवल दूसरे ने मेरे लिए काम किया। सबकुछ एक ही निर्देशिका में था इसलिए मुझे यकीन नहीं है कि क्या अंतर है ..? - Shautieh
@Shautieh: -एन वास्तव में इसे चलाने से रोकता है। मैं जवाब स्पष्ट कर दूंगा। - naught101


यह शेल स्क्रिप्ट लिनक्स / विंडोज और एफएटी / एनटीएफएस / एक्सएफएटी के बीच पोर्टेबल फ़ाइलों को बनाने के लिए, एक निर्देशिका को पुन: व्यवस्थित करती है। यह नियंत्रण पात्रों को हटा देता है, /:*?"<>\| और कुछ आरक्षित विंडोज नाम जैसे COM0

sanitize() {
  shopt -s extglob;

  filename=$(basename "$1")
  directory=$(dirname "$1")

  filename_clean=$(echo "$filename" | sed -e 's/[\\/:\*\?"<>\|\x01-\x1F\x7F]//g' -e 's/^\(nul\|prn\|con\|lpt[0-9]\|com[0-9]\|aux\)\(\.\|$\)//i' -e 's/^\.*$//' -e 's/^$/NONAME/')

  if (test "$filename" != "$filename_clean")
  then
    mv -v "$1" "$directory/$filename_clean"
  fi
}

export -f sanitize

sanitize_dir() {
  find "$1" -depth -exec bash -c 'sanitize "$0"' {} \;
}

sanitize_dir '/path/to/somewhere'

सिद्धांत में लिनक्स कम प्रतिबंधित है (/ तथा \0 फाइलनामों में कड़ाई से वर्जित हैं) लेकिन व्यवहार में कई पात्र बैश कमांड में हस्तक्षेप करते हैं (जैसे *...) तो उन्हें फ़ाइल नामों से भी बचा जाना चाहिए।

फ़ाइल नामकरण प्रतिबंधों के लिए महान स्रोत:


5
2018-05-11 20:50



यह मैं क्या खोजता हूँ! लेकिन रिक्त स्थान के साथ डीआईआर का समर्थन करने के लिए उद्धरण जोड़ें "$ 1" -depth -exec bash -c 'sanitize "$ 0"' {} \; - mmv-ru


मेरे पास टूटी हुई यूएसबी स्टिक से बरामद टूटे हुए फाइलनामों के साथ कुछ जापानी फाइलें थीं और उपरोक्त समाधान मेरे लिए काम नहीं करते थे।

मैं डिटॉक्स पैकेज की सिफारिश करता हूं:

डिटॉक्स यूटिलिटी फाइलों का नाम बदलती है जिससे उन्हें काम करना आसान हो जाता है। यह रिक्त स्थान और ऐसी अन्य परेशानियों को हटा देता है। यह 8-बिट ASCII में एन्कोड किए गए लैटिन -1 (आईएसओ 885 9 -1) वर्णों का अनुवाद या सफाई भी करेगा, यूटीएफ -8 में एन्कोड किए गए यूनिकोड वर्ण, और सीजीआई पात्रों से बच निकलेगा।

उदाहरण का उपयोग:

detox -r -v /path/to/your/files
- उपनिर्देशिका में रिकर्स
-v वर्बोज़ बनें कि किस फाइल का नाम बदला जा रहा है
-एक सूखे दौड़ के लिए इस्तेमाल किया जा सकता है (केवल दिखाएं कि क्या बदला जाएगा)

5
2017-08-30 06:57



यह बहुत अधिक होना चाहिए, मैं सभी को देखने के लिए आग्रह करता हूं detox अनिवार्य रूप से पहिया को पुनर्निर्मित करने से पहले। यदि आप मैन पेज को देखते हैं, तो आप देखेंगे कि इसमें लचीलापन के कारण यहां अन्य सभी प्रस्तावित समाधान शामिल हैं। - emk2203


यदि आप एम्बेडेड न्यूलाइन, मल्टीबाइट वर्ण, रिक्त स्थान, अग्रणी डैश, बैकस्लाश और रिक्त स्थान को संभालना चाहते हैं, तो आपको कुछ और मजबूत की आवश्यकता होगी, यह उत्तर देखें:
https://superuser.com/a/858671/365691

यदि कोई दिलचस्पी लेता है तो मैंने स्क्रिप्ट को code.google.com पर रखा है: आर-एन-च-बैश-नाम बदलने स्क्रिप्ट


0
2017-12-31 00:09





* में फ़ाइल के लिए; एमवी "$ फ़ाइल" $ करें (echo "$ file" | sed -e's / [^ ए-ज़ा-जेड -9।-] // जी '); किया हुआ &


-2
2017-07-04 21:53



आपको समझाया जाना चाहिए कि आपका कोड क्या करता है और उचित प्रारूपण का उपयोग करता है। आपके कोड नामों में टकराव शुरू करके फ़ाइलों को हटाया जा सकता है। और पृष्ठभूमि में पूरी चीज चलाना मूर्खतापूर्ण है। - kasperd