ls के पास कुछ स्विच हैं (जैसे --quote-name, --escape, --literal) जो कि अनपेक्षित वर्णों से निपटने के लिए है, लेकिन इस मामले में ऐसा लगता है कि चरित्र "प्रिंट करने योग्य" है, लेकिन "टाइप करने योग्य" नहीं है (कम से कम मेरे कीबोर्ड पर! ), इसलिए इनमें से कोई भी स्विच मदद नहीं करता है।
इसलिए, उनके नाम के किसी भी वर्ण के साथ फ़ाइलों से छुटकारा पाने के लिए एक सामान्य "जानवर बल" दृष्टिकोण के रूप में, आप यह कर सकते हैं:
$ /bin/ls -1A|cat -n # list all files (except . and ..), 1 per line, add line numbers
1 ♫
2 f1.txt
3 f2.txt
आपत्तिजनक फ़ाइल वाली लाइन का पता लगाएं। काफी संभावना है कि यह पहली पंक्ति होगी, लेकिन मान लें कि यह 5 वीं है। प्रिंट लाइन 5 और हेक्स इसे एनकोड करते हैं:
$ /bin/ls -1A|sed -n 5p|xxd -g 1
0000000: e2 99 ab 0a ....
0a (newline) वर्ण को अनदेखा करना, एक भागने स्ट्रिंग का निर्माण करना, और पलायन का अनुवाद करने के लिए गूंज के -e विकल्प का उपयोग करें:
$ echo -e '\xe2\x99\xab'
♫
अब आप इसे इस तरह से कॉपी / मूव / डिलीट कर सकते हैं:
$ cp -vi $(echo -e '\xe2\x99\xab') better_name
‘♫’ -> ‘better_name’
इसके अलावा, यदि आप शेल स्क्रिप्ट का उपयोग करने के लिए सीमित नहीं हैं, तो आप इसे इस तरह से पायथन में कर सकते हैं:
$ python
>>> import os
>>> os.listdir('.')
[ ..., '\xe2\x99\xab', ... ]
>>> print '\xe2\x99\xab'
♫
>>> import shutil
>>> shutil.copy('\xe2\x99\xab', 'better_name')
इस दृष्टिकोण का उपयोग करते हुए, आप कई फ़ाइलों को संसाधित कर सकते हैं, आपको बस सही फ़ाइलों का चयन करने के लिए तर्क लिखना होगा, और उन्हें क्लॉबरिंग के बिना नाम बदलना, आदि:
for f in os.listdir('.'):
if not f.isalnum():
newname = generate_newname(f)
if not os.path.exists(newname):
shutil.copy(f, newname)
else:
print newname, 'already exists!'
*restoffile.avi
या इस तरह का कुछ?