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行并对其进行十六进制编码:
$ /bin/ls -1A|sed -n 5p|xxd -g 1
0000000: e2 99 ab 0a ....
忽略0a(换行符)字符,构造转义字符串,并使用echo的-e选项转换转义:
$ echo -e '\xe2\x99\xab'
♫
现在,您可以像这样复制/移动/删除它:
$ cp -vi $(echo -e '\xe2\x99\xab') better_name
‘♫’ -> ‘better_name’
另外,如果您不限于使用Shell脚本,则可以在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
或类似的东西?