ls memiliki beberapa sakelar (seperti --quote-name, --escape, --literal) untuk berurusan dengan karakter yang tidak patut dicetak, tetapi dalam hal ini tampaknya karakter tersebut "dapat dicetak" tetapi tidak "dapat diketik" (setidaknya pada keyboard saya! ), jadi tak satu pun dari switch ini tampaknya membantu.
Oleh karena itu, sebagai pendekatan umum "brute force" untuk menyingkirkan file dengan karakter apa pun dalam namanya, Anda dapat melakukan ini:
$ /bin/ls -1A|cat -n # list all files (except . and ..), 1 per line, add line numbers
1 ♫
2 f1.txt
3 f2.txt
Temukan baris yang berisi file yang menyinggung. Sangat mungkin itu akan menjadi baris ke-1, tetapi katakanlah itu adalah baris ke-5. Cetak baris 5 dan hex enkode:
$ /bin/ls -1A|sed -n 5p|xxd -g 1
0000000: e2 99 ab 0a ....
Mengabaikan karakter 0a (baris baru), membuat string pelarian, dan menggunakan opsi -e dari gema untuk menerjemahkan escapes:
$ echo -e '\xe2\x99\xab'
♫
Sekarang Anda dapat menyalin / memindahkan / menghapusnya seperti ini:
$ cp -vi $(echo -e '\xe2\x99\xab') better_name
‘♫’ -> ‘better_name’
Juga, jika Anda tidak dibatasi untuk menggunakan skrip shell, Anda bisa melakukannya dengan Python seperti ini:
$ python
>>> import os
>>> os.listdir('.')
[ ..., '\xe2\x99\xab', ... ]
>>> print '\xe2\x99\xab'
♫
>>> import shutil
>>> shutil.copy('\xe2\x99\xab', 'better_name')
Dengan menggunakan pendekatan ini, Anda dapat memproses banyak file, Anda hanya perlu menulis logika untuk memilih file yang benar, dan mengganti nama file tersebut tanpa mengganggu, dll:
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
atau sesuatu seperti ini?