ls'de, --quote-name, --escape, --literal gibi) yazdırılamayan karakterlerle uğraşmak için bazı anahtarlar vardır (ancak --quote-name, --escape, --literal); ), bu yüzden bu anahtarların hiçbiri yardımcı görünüyor.
Bu nedenle, adlarında herhangi bir karakter içeren dosyalardan kurtulmak için genel bir "kaba kuvvet" yaklaşımı olarak, şunları yapabilirsiniz:
$ /bin/ls -1A|cat -n # list all files (except . and ..), 1 per line, add line numbers
1 ♫
2 f1.txt
3 f2.txt
Sorunlu dosyayı içeren satırı bulun. Oldukça büyük olasılıkla o 1. sıra olacak, ama diyelim ki 5.. Baskı satırı 5 ve altıgen kodlar:
$ /bin/ls -1A|sed -n 5p|xxd -g 1
0000000: e2 99 ab 0a ....
0a (newline) karakterini yok sayarak, bir kaçış dizesi oluşturun ve çıkışları çevirmek için -e echo seçeneğini kullanın:
$ echo -e '\xe2\x99\xab'
♫
Şimdi bu şekilde kopyalayabilir / taşıyabilir / silebilirsiniz:
$ cp -vi $(echo -e '\xe2\x99\xab') better_name
‘♫’ -> ‘better_name’
Ayrıca, kabuk betiğini kullanmakla sınırlı değilseniz, Python'da şöyle yapabilirsiniz:
$ python
>>> import os
>>> os.listdir('.')
[ ..., '\xe2\x99\xab', ... ]
>>> print '\xe2\x99\xab'
♫
>>> import shutil
>>> shutil.copy('\xe2\x99\xab', 'better_name')
Bu yaklaşımı kullanarak birçok dosyayı işleyebilir, doğru dosyaları seçmek için mantığı yazmanız ve bunları gizlice koymadan yeniden adlandırmanız yeterlidir.
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
ya da böyle bir şey?