ls có một số công tắc (như --quote-name, --escape, --literal) để xử lý các ký tự không thể in được, nhưng trong trường hợp này có vẻ như ký tự là "có thể in" nhưng không "đánh máy được" (ít nhất là trên bàn phím của tôi! ), vì vậy không có công tắc nào trong số này có vẻ hữu ích.
Do đó, như một cách tiếp cận "vũ phu" chung để loại bỏ các tệp có bất kỳ ký tự nào trong tên của chúng, bạn có thể thực hiện việc này:
$ /bin/ls -1A|cat -n # list all files (except . and ..), 1 per line, add line numbers
1 ♫
2 f1.txt
3 f2.txt
Tìm dòng chứa tệp vi phạm. Rất có thể nó sẽ là dòng thứ 1, nhưng hãy nói nó là dòng thứ 5. In dòng 5 và hex mã hóa nó:
$ /bin/ls -1A|sed -n 5p|xxd -g 1
0000000: e2 99 ab 0a ....
Bỏ qua ký tự 0a (dòng mới), xây dựng chuỗi thoát và sử dụng tùy chọn -e của echo để dịch các lối thoát:
$ echo -e '\xe2\x99\xab'
♫
Bây giờ bạn có thể sao chép / di chuyển / xóa nó như thế này:
$ cp -vi $(echo -e '\xe2\x99\xab') better_name
‘♫’ -> ‘better_name’
Ngoài ra, nếu bạn không bị giới hạn sử dụng shell script, bạn có thể thực hiện nó trong Python như thế này:
$ python
>>> import os
>>> os.listdir('.')
[ ..., '\xe2\x99\xab', ... ]
>>> print '\xe2\x99\xab'
♫
>>> import shutil
>>> shutil.copy('\xe2\x99\xab', 'better_name')
Sử dụng phương pháp này, bạn có thể xử lý nhiều tệp, bạn chỉ cần viết logic để chọn đúng tệp và đổi tên chúng mà không bị ghi đè, v.v .:
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
hoặc thứ gì đó giống thế này?