印刷できない文字のみを含むファイルを見つける方法はありますか?

印刷できない文字のみを含むファイルを見つける方法はありますか?

私のプログラムが正しく実行されず、印刷できない文字の数だけで多くのファイルを生成します。このファイルをインポートすると、何も表示されません(印刷できない文字なので)。ただし-empty、または同じコマンドを使用すると、-size 0ファイルは表示されませんfind

印刷できない文字のみを含むファイルを検索する方法を知っている人はいますか?

答え1

GNU grep(および他の多くのgrep実装)を使用すると、印刷可能な文字を含まないファイルを検索できます。この-Lオプションは、一致が含まれていないファイルを一覧表示することを意味します。[[:print:]](はい、2つの括弧があります)印刷可能文字と一致します。印刷可能文字の定義は、ロケールによって異なります。

grep -L '[[:print:]]' -- *

これには空のファイル(例:ミンダスは指摘した。)。

これを削除するには(grep最初に出力を見て、正しいファイルが削除されていることを確認してください)、ファイル名に改行文字が含まれていないとします。

grep -L '[[:print:]]' -- * |
while IFS= read -r filename; do
  if [ -f "$filename" ] && [ -s "$filename" ]; then
    rm "$filename"
  fi
done

またはそれに対応するもの(空のファイルも削除されることに注意してください)

set +f; IFS='
' # split at newlines, turn off globbing
rm -- $(set -f; grep -L '[[:print:]]' -- *)
set -f; unset IFS

上記のコマンドは、現在のディレクトリにサブディレクトリがある場合はエラーメッセージを生成します(ディレクトリを呼び出すので、呼び出さないでrmくださいrm -r)。 zshでは、*(.L+0)代わりに空でない通常のファイルを一致させることができ、*ファイル名の特殊文字(改行を除く)について心配する必要はありません。

IFS=$'\n'
rm -- $(grep -L '[[:print:]]' -- *(.))
unset IFS

POSIXツールのみを使用してgrep -l '[[:print:]]' -- *アーカイブしたいファイルを表示します(空のファイルを除く)。

または、ファイルを繰り返すこともできます。これはよりクリーンで確実に特殊文字に問題を引き起こさないが(ドットファイルをスキップする)理論的には(測定可能ではないが)遅い。

for x in *; do
  if [ -f "$x" ] && [ -s "$x" ] && ! grep -q '[[:print:]]' <"$x"; then
    rm -- "$x"
  fi
done

答え2

最善の方法は、次を使用することですfile

find . -type f -exec file {} + | grep ": data"

これで、最初は正しいマジック番号を持つファイルをランダムにキャプチャできませんが、とにかく他のほとんどの方法ではそのファイルを見逃す可能性があります。

これらのファイルを見つける他の方法:

  • 最後の修正:find -mmin 5= 5分前
  • サイズ(0日は不要):find -size -4k= 4096バイト未満

関連情報