20

印刷できない文字を含む古い移行ファイルがいくつかあります。そのような名前のファイルをすべて見つけて、システムから完全に削除したいと思います。

例:

ls -l
-rwxrwxr-x 1 cws cws      0 Dec 28  2011 ??"??

ls -lb
-rwxrwxr-x 1 cws cws      0 Dec 28  2011 \a\211"\206\351

そのようなファイルをすべて見つけたいと思います。

lsこのようなフォルダーでを実行したときに表示されるスクリーンショットの例を次に示します。

ここに画像の説明を入力

印刷できない文字を含むこれらのファイルを見つけて、それらを削除したいだけです。

4

5 に答える 5

31
于 2013-10-02T21:02:10.297 に答える
3

これで、おそらく質問は解決したと思いますが、スイッチfindを使用したときに表示されていないファイルがあったため、私の場合はうまくいきませんでした。-regexそこで、を使用してこの回避策を開発しlsました。それが誰かに役立つことを願っています。

基本的に、私にとってうまくいったのはこれでした:

ls -1 -R -i | grep -a "[^A-Za-z0-9_.':@ /-]" | while read f; do inode=$(echo "$f" | cut -d ' ' -f 1); find -inum "$inode" -delete; done

部分的に分割する:

ls -1 -R -i

これにより、現在のディレクトリの下にあるファイルが再帰的に ( -R) リスト ( ) され、1 行に 1 ファイル ( )、各ファイルの前に inode 番号 ( ) が付けられます。結果は にパイプされます。ls-1-igrep

grep -a "[^A-Za-z0-9_.':@ /-]"

-a最終的にバイナリになる場合でも、各入力をテキスト ( ) と見なして各エントリをフィルター処理します。grepリストで指定されたものとは異なる文字が含まれている場合、行は通過します。結果は にパイプされwhileます。

while read f
do
    inode=$(echo "$f" | cut -d ' ' -f 1)
    find -inum "$inode" -delete
done

これwhileにより、すべてのエントリが繰り返され、inode 番号が抽出され、inode が に渡されfindます。これにより、ファイルが削除されます。

于 2016-05-06T14:35:12.413 に答える
0

grep を使用すると、バックスラッシュを含む行のみを出力できます。

ls -lb | grep \\\\
于 2013-10-02T20:53:54.403 に答える