सवाल विशेष वर्णों के साथ फ़ाइलों और फ़ोल्डरों का नाम बदलें


इस के साथ संघर्ष और गुगलिंग मुझे ऐसा समाधान नहीं दे रहा है जो काम करता है।

मेरे पास एक फ़ोल्डर है ...

file å?? name.txt

उदाहरण के लिए और समस्याओं से बचने के लिए, मैं इसका नाम बदलना चाहता हूं हालांकि मैं काम करने के लिए संघर्ष कर रहा हूं। मैंने उपयोग करने की कोशिश की है ' ' और मैंने भी कोशिश करने की कोशिश की \ प्रत्येक विशेष चरित्र से पहले उदा। 'file \å\?\? name \(2008\).txt' लेकिन मुझे बस निम्न त्रुटि मिलती है ...

-bash: cd: file \å\?\? name \(2008\).txt : No such file or directory

क्या यह अनुचित उपयोग है \ या मुझे वैकल्पिक दृष्टिकोण की आवश्यकता है?

धन्यवाद


3
2017-11-07 23:09


मूल


superuser.com/questions/538161/... - rɑːdʒɑ
कर देता है टैब पूर्णता सहायता उदाहरण टाइपिंग mv file और फिर टैब कुंजी दबाकर - steeldriver
@steeldriver मुझे संदेह है कि गैर प्रिंटिंग वर्णों में मदद मिलेगी जो लगभग निश्चित रूप से ओपी के पास है। foo\r\r के रूप में दिखाई देगा foo^M^M टैब पूर्ण होने में और यह इसे हटाने के लिए काम नहीं करेगा। - terdon♦
@terdon rm foo^M^M मेरे लिए काम किया (यह कि टैब के पूरा होने के बाद क्या दिखाया गया है touch $'foo\r\r' - muru
@मुरु हुह, तो ऐसा करता है, मैं सही खड़ा हूं। धन्यवाद। - terdon♦


जवाब:


गैर-ASCII वर्ण समस्या नहीं हैं, आपका खोल सौदा कर सकता है å बिल्कुल अच्छी तरह से। मुद्दा यह है कि आपकी फ़ाइल वास्तव में नामित नहीं है å??। अगर यह थे, rm 'å??' या और भी rm å?? काम किया होगा।

आप मानते हैं कि यह है å?? क्योंकि यही है ls दिखाता है, और यह एक उचित धारणा है, लेकिन ls विभिन्न चीजों को दिखाएगा ?। उदाहरण के लिए:

$ mkdir "file å"\?\?" name.txt" "file å"$'\n'$'\n'" name.txt" "file å"$'\t'$'\t'" name.txt" "file å"$'\r'$'\r'" name.txt" "file å"$'\b'$'\b'" name.txt" "file å"$'\v'$'\v'" name.txt"

$ ls -l
total 24K
drwxr-xr-x 2 terdon users 4.0K Nov  8 13:02 file å?? name.txt
drwxr-xr-x 2 terdon users 4.0K Nov  8 13:02 file å?? name.txt
drwxr-xr-x 2 terdon users 4.0K Nov  8 13:02 file å?? name.txt
drwxr-xr-x 2 terdon users 4.0K Nov  8 13:01 file å?? name.txt
drwxr-xr-x 2 terdon users 4.0K Nov  8 13:02 file å?? name.txt
drwxr-xr-x 2 terdon users 4.0K Nov  8 13:02 file å?? name.txt

जैसा कि आप ऊपर देख सकते हैं, न्यूलाइन, टैब, कैरिज रिटर्न, घंटी और लंबवत टैब (दूसरों के बीच) सभी को दिखाया गया है ?। वास्तव में ऊपर बनाए गए लोगों की केवल पहली फ़ाइल / निर्देशिका है ? इसके नाम पर हम इसकी पुष्टि कर सकते हैं ls -b:

$ ls -lb
total 24
drwxr-xr-x 2 terdon users 4096 Nov  8 13:02 file\ å??\ name.txt
drwxr-xr-x 2 terdon users 4096 Nov  8 13:02 file\ å\b\b\ name.txt
drwxr-xr-x 2 terdon users 4096 Nov  8 13:02 file\ å\t\t\ name.txt
drwxr-xr-x 2 terdon users 4096 Nov  8 13:01 file\ å\n\n\ name.txt
drwxr-xr-x 2 terdon users 4096 Nov  8 13:02 file\ å\v\v\ name.txt
drwxr-xr-x 2 terdon users 4096 Nov  8 13:02 file\ å\r\r\ name.txt

तो, आप या तो चला सकते हैं ls -b सही फ़ाइल नाम प्राप्त करने के लिए और फिर उपयोग करें एएनएसआई सी उद्धरण इसका नाम बदलने के लिए:

mv å$'\r'$'\r' newname

वैकल्पिक रूप से, आप उन सभी फ़ाइलों / निर्देशिकाओं से मेल खाने के लिए एक ग्लोब का उपयोग कर सकते हैं जिनके नाम से शुरू होता है file å (ध्यान दें: यह केवल तभी काम करेगा यदि आपके पास सिर्फ एक है):

mv "file å*" newname

या, उन सभी फ़ाइलों / निर्देशिकाओं का नाम बदलें जिनके नाम में गैर अल्फान्यूमेरिक वर्ण हैं (फिर से, केवल उन मामलों के लिए उपयोगी जहां आपके पास एक ऐसा मामला है):

shopt -s extglob  ## turn on extended globbing
mv !(*([[:graph:]])) newname

अनोखा !(*([[:graph:]])) कुछ समझाओ की जरूरत है। extglob विस्तारित ग्लोबिंग को सक्षम बनाता है जो हमें उपयोग करने देता है !(foo) "फू नहीं" से मेल खाते हैं। [[:graph:]] चरित्र वर्ग सभी प्रिंट करने योग्य पात्रों से मेल खाता है (टैब, न्यूलाइन आदि नहीं) इसलिए, अस्वीकृत मैच !(*([[:graph:]])) गैर-प्रिंटिंग वर्णों के साथ सभी फ़ाइल / डायरनामों से मेल खाएगा।

यदि आपको एक से अधिक ऐसे मामले से निपटने की ज़रूरत है, तो लूप का उपयोग करें। कुछ इस तरह:

for dir in !(*([[:graph:]])); do 
     mv "$dir" "${dir//[^[:graph:]]/_}"; 
done

${dir//[^[:graph:]]/_} सभी गैर-प्रिंटिंग वर्णों के साथ निर्देशिका नाम है _। इस दृष्टिकोण के साथ समस्या यह है कि आपके पास अलग-अलग स्रोत निर्देशिकाएं हो सकती हैं जो एक ही नाम से समाप्त हो जाएंगी (उदा। foo\n तथा foo\t दोनों बन जाएंगे foo_)। यदि यह एक समस्या है, तो बस काउंटर का उपयोग करके नाम बदलें:

a=0; for dir in !(*([[:graph:]])); do 
    ((a++)); 
     mv "$dir" "${dir//[^[:graph:]]/_}$a"
done

इसके परिणामस्वरूप:

drwxr-xr-x 2 terdon users 4096 Nov  8 13:08 file_å___name.txt1
drwxr-xr-x 2 terdon users 4096 Nov  8 13:08 file_å___name.txt2
drwxr-xr-x 2 terdon users 4096 Nov  8 13:08 file_å___name.txt3
drwxr-xr-x 2 terdon users 4096 Nov  8 13:08 file_å??_name.txt4
drwxr-xr-x 2 terdon users 4096 Nov  8 13:08 file_å___name.txt5
drwxr-xr-x 2 terdon users 4096 Nov  8 13:08 file_å___name.txt6

5
2017-11-08 10:52



इस विस्तृत प्रतिक्रिया के लिए धन्यवाद। Ls -l के बारे में आपका प्रारंभिक बिंदु फ़ाइल या फ़ोल्डर का वास्तविक नाम नहीं दिखा रहा था। यह विधि मेरे लिए काम करती है। इस तरह से ऐसा करने में अच्छा लगा लेकिन यह जानना भी अच्छा है कि मध्यरात्रि कमांडर मुझे आवश्यकता होने पर परेशानी से बाहर कर सकता है। ऐसा करने के लिए समय निकालने के लिए धन्यवाद। - spcurtis81


जहां तक ​​मैं समझता हूं कि आप एक फ़ाइल या फ़ोल्डर का नाम बदलना चाहते हैं जिसमें गैर-अंग्रेज़ी वर्ण टर्मिनल का उपयोग कर रहे हैं।

इसके लिए, आप इसका उपयोग कर सकते हैं

mv x y

जहां x उस फ़ाइल / फ़ोल्डर का नाम है जिसे आप पुनर्नामित करना चाहते हैं और y वह नया नाम है जिसे आप चाहते हैं।

यदि इसका उपयोग करने के बाद गैर-अंग्रेज़ी वर्ण और / या रिक्त स्थान हैं ' ' एक्स और वाई की सीमाओं को निर्दिष्ट करने के लिए करना चाहिए। यहां एक उदाहरण दिया गया है:

mv 'öld namé öf fileş' 'néw namé öf fileş'

अगर मैं आपके प्रश्न को गलत समझा तो कृपया मुझे सही करें।


0
2017-11-07 23:53



आपने मेरा प्रश्न सही ढंग से समझा, धन्यवाद। मैंने आपके द्वारा दी गई विधि की कोशिश की है लेकिन आश्चर्यजनक रूप से मुझे अपनी मूल पोस्ट में वर्णित ऐसी कोई फ़ाइल या निर्देशिका त्रुटि नहीं मिली है। यकीन नहीं है कि यह क्यों काम नहीं करता है। इसके बजाय मुझे मध्यरात्रि कमांडर का उपयोग करके इसका समाधान मिला। अजीब बात यह है कि '' विधि मेरे उदाहरण के लिए काम नहीं करती है। - spcurtis81
अजीब। यह काम करना चाहिए। आपने इस्तेमाल किया cd उस फ़ोल्डर की निर्देशिका में जिसे आप सही नाम बदलना चाहते हैं? - SarpSTA
ओपी ने पहले ही उद्धरण करने की कोशिश की है और वैसे भी, utf8 सक्षम टर्मिनल पर गैर-अंग्रेज़ी वर्णों को उद्धृत करने की कोई आवश्यकता नहीं है। प्रयत्न touch τσουτσού && mv τσουτσού foo उदाहरण के लिए। - terdon♦
@terdon उसी विधि के बाद जिसे ओपी ने कोशिश की, मुझे भी इसी तरह की समस्या का सामना करना पड़ा। कोट्स का उपयोग मेरे मामले को तय किया। कृपया ध्यान दें कि मैंने गैर-Eng पात्रों के लिए यह सुझाव नहीं दिया था कि मैंने इसे अपने परीक्षण में रखने के लिए सुझाव दिया था, जिससे समस्या हल हो गई। जब मैं "फाइल å ?? name.txt" का नाम बदलना चाहता हूं "τσουτσού ooo çaçaça" के बग़ैर उद्धरणों का उपयोग करके मुझे ऐसी कोई फ़ाइल या निर्देशिका भी नहीं मिलती है। इसके अलावा मुझे एहसास है कि टर्मिनल की समस्या यह नहीं है कि यह पात्रों को पहचान नहीं सकता है। - SarpSTA
मैं समझता हूं कि, लेकिन ओपी ने सवाल में कहा कि वे था प्रयुक्त उद्धरण, और इस मामले में उद्धरण केवल रिक्त स्थान के लिए आवश्यक हैं, आपके उत्तर में कुछ भी शामिल नहीं किया गया है जो पहले से ही प्रश्न में उल्लिखित नहीं है। - terdon♦


आपने स्पष्ट रूप से भागने और उद्धरण का प्रयास किया है, आप वाइल्डकार्ड का उपयोग परेशान फ़ाइल नामों के साथ भी कर सकते हैं, उदाहरण के लिए,

$ ls *name\ 2008\ .txt    <==== make sure you only get the one file

$ mv *name\ 2008\ .txt  my_new_name.txt

यदि यह आपकी ज़रूरत को पूरा नहीं करता है, तो मुझे बताएं - गैर-ग्लोबिंग का उपयोग करके अन्य दृष्टिकोण हैं।


0
2017-11-08 06:06