फ़ाइल नाम से अमान्य वर्ण कैसे निकालें?


47

मेरे पास इन जैसे अमान्य वर्ण वाली फाइलें हैं

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

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

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

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

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

5
वर्ण शायद "अमान्य" नहीं हैं, अन्यथा फ़ाइल सिस्टम उन्हें संग्रहीत नहीं करेगा (जब तक कि आपने वास्तव में एफएस के लिए कुछ बुरा नहीं किया था )। क्या आपने नामों को सही ढंग से प्रदर्शित करने के लिए अपना स्थान (जैसे UTF8) बदलने की कोशिश की है?
जेम्स ओ'गॉर्मन

जवाबों:


41

एक तरीका सेड के साथ होगा:

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

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


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

1
एच। हेस द्वारा सबसे अच्छा समाधान के लिए नीचे देखें ... (और मेरी मजेदार टिप्पणी :))
Jan Sila

31

मुझे लगता है कि आप लिनक्स बॉक्स पर हैं और फाइलें विंडोज बॉक्स पर बनाई गई थीं। लिनक्स फ़ाइल नाम के लिए वर्ण एन्कोडिंग के रूप में UTF-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

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

स्रोत: लीजवेबलैब्स


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

यह इंगित करने के लायक है कि डिफ़ॉल्ट रूप से "टेस्ट" मोड में रनमव रन करता है, जहां यह सिर्फ एक ड्राई रन करता है और आपको बताता है कि यह किस फाइल को स्थानांतरित करेगा। यह आपको बताएगा कि --notestवास्तव में फ़ाइलों का नाम बदलने के विकल्प के साथ इसे फिर से चलाएं ।
केनी रैशर्ट

16

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

यहाँ मैं यह करूँगा तरीका है

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

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


13

Https://stackoverflow.com/questions/2124010/grep-regex-to-match-non-ascii-characters पर निम्नलिखित उत्तर आप उपयोग कर सकते हैं:

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

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

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

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


क्या उदाहरण के लिए ü और ä जैसे विदेशी पात्रों को रखने के लिए इसे संशोधित करने का कोई तरीका है?
एल्डर गीक

केवल दूसरे ने मेरे लिए काम किया। सब कुछ उसी निर्देशिका में था इसलिए मुझे यकीन नहीं है कि क्या अंतर है ..?
शौतिह

1
@ शतुइह: -एन वास्तव में चलने से रोकता है। मैं जवाब स्पष्ट कर दूंगा।
n

बहुत सारी फ़ाइलों के साथ काम करने पर नाम धीमा हो सकता है। यदि आप इसे गति देना चाहते हैं, तो चेक को खोजने में धक्का दें। मुझे यकीन नहीं है कि हालांकि यह कैसे करना है।
isallw

13

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

मैं डिटॉक्स पैकेज की सलाह देता हूं:

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

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

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

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

यहेजकेल 25:17 - धन्य है वह, जो परोपकार और भलाई के नाम पर इस समाधान को आगे बढ़ाएगा, क्योंकि वह वास्तव में अपने भाई की रक्षा करने वाला और खोए हुए बच्चों का खोजक है।
Jan Sila

अनजाने में, रास्ता 'नहीं हो सकता।' डेबियन में। यदि आप '' का उपयोग करते हैं। यह कुछ भी नहीं पाता है।
isallw

मुझे आश्चर्य है कि अगर यह वास्तव में काम करता है, तो यह चीनी वर्णों को हटा / प्रतिस्थापित करता है, उदाहरण के लिए 的节奏啊, लेकिन वे वर्ण मान्य फ़ाइल नाम हैं।
林果

5

यह शेल स्क्रिप्ट लिनक्स / विंडोज और एफएटी / एनटीएफएस / एक्सफैट के बीच फाइलों को पोर्टेबल बनाने के लिए, एक निर्देशिका को पुनर्सक्रिय करता है। यह नियंत्रण वर्ण /:*?"<>\|और कुछ आरक्षित विंडोज नाम को हटा देता है 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फ़ाइल नाम में कड़ाई से निषिद्ध है) लेकिन व्यवहार में कई अक्षर बैश कमांड के साथ हस्तक्षेप करते हैं (जैसे *...) इसलिए उन्हें फ़ाइल नाम से भी बचना चाहिए।

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


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

1

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

अगर कोई दिलचस्पी रखता है तो मैंने स्क्रिप्ट को code.google.com पर डाल दिया: rnf-bash-rename-script


यहाँ से जुड़ी स्क्रिप्ट ने मेरे लिए समस्या हल कर दी
यिर्मयाह रोज

0

मैं इस एक-लाइनर का उपयोग उपशीर्षक फ़ाइलों में अमान्य वर्णों को निकालने के लिए करता हूं:

for f in *.srt; do nf=$(echo "$f" |sed -e 's/[^A-Za-z0-9.-]/./g;s/\.\.\././g;s/\.\././g'); test "$f" != "$nf" && mv "$f" "$nf" && echo "$nf"; done
  1. केवल प्रक्रिया * .Srt फ़ाइलें (* का उपयोग *। Srt हर फ़ाइल को संसाधित करने के लिए किया जा सकता है)
  2. अक्षर ए-ज़-ज़, संख्या 0-9, अवधि "," और डैश का "-" को छोड़कर अन्य सभी पात्रों को हटा देता है।
  3. संभावित डबल या ट्रिपल पीरियड्स को हटाता है
  4. यह देखने के लिए जाँच करता है कि फ़ाइल नाम बदलने की आवश्यकता है या नहीं
  5. यदि यह सही है, तो यह mv कमांड के साथ फाइल का नाम बदल देता है, फिर इको कमांड के साथ किए गए परिवर्तनों को आउटपुट करता है

यह फिल्मों के निर्देशिका नामों को सामान्य बनाने के लिए काम करता है:

for f in */; do nf=$(echo "$f" |sed -e 's/[^A-Za-z0-9.]/./g' -e 's/\.\.\././g' -e 's/\.\././g' -e 's/\.*$//'); test "$f" != "$nf" && mv "$f" "$nf" && echo "$nf"; done

उपरोक्त चरणों के समान ही, लेकिन मैंने निर्देशिका के अंत में एक अवधि निकालने के लिए एक और sed कमांड जोड़ी

भविष्य के अतीत के एक्स-मेन डेज़ (2014) [1080p] इसमें
संशोधन किया गया:
X-Men.Days.of.Future.Past.2014.1080p


-2

फ़ाइल में * के लिए; do mv "$ फ़ाइल" $ (प्रतिध्वनि "$ फ़ाइल" | sed -e 's / [^ A-Za-Z00-9। ]] / / g'); किया हुआ &


2
आपको यह बताना चाहिए कि आपका कोड क्या करता है और उचित प्रारूपण का उपयोग करता है। आपका कोड नामों में टकरावों की शुरुआत करके फ़ाइलों को हटाने का कारण बन सकता है। और पृष्ठभूमि में पूरी चीज चलाना मूर्खतापूर्ण है।
कास्परड
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.