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行目を印刷し、16進数でエンコードします。
$ /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’
また、シェルスクリプトの使用に限定されていない場合は、次のように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
またはこのような何か?