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
ค้นหาบรรทัดที่มีไฟล์ที่ละเมิด ค่อนข้างเป็นไปได้ว่ามันจะเป็นบรรทัดที่ 1 แต่สมมุติว่าเป็นบรรทัดที่ 5 พิมพ์บรรทัดที่ 5 และเข้ารหัส hex:
$ /bin/ls -1A|sed -n 5p|xxd -g 1
0000000: e2 99 ab 0a ....
ละเว้นอักขระ 0a (ขึ้นบรรทัดใหม่) สร้างสตริง escape และใช้อ็อพชัน -e ของ echo เพื่อแปล escapes:
$ echo -e '\xe2\x99\xab'
♫
ตอนนี้คุณสามารถคัดลอก / ย้าย / ลบแบบนี้:
$ cp -vi $(echo -e '\xe2\x99\xab') better_name
‘♫’ -> ‘better_name’
นอกจากนี้หากคุณไม่ได้ จำกัด การใช้เชลล์สคริปต์คุณสามารถทำได้ใน Python ดังนี้:
$ 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
หรืออะไรแบบนี้