web-dev-qa-db-ja.com

Debian / UbuntuでNULのみで構成される長さが0バイトを超えるファイルを検索します

QNAP nasでfsckなしで約4年間実行されていたext4ドライブをfsckした後、正しいサイズ(通常は8〜12 mib)のように見えるファイルがいくつかありますが、その内容は各バイトです。 null/NUL/00です(つまり、16進エディターで見たときに0が何度も繰り返されます)。

'hexedit'ツールでこれを確認し、 'od'でさまざまな長さのバイトをサンプリングしました

10,000以上のNEFおよびJPEG画像ファイルを検索するのではなく、これらのファイルの検索を自動化してリストに書き込む方法はありますか?バックアップから復元できますか?

3
inflammable

ファイルにNULL文字列のみが含まれている(改行なし、\n)と仮定すると、grepを使用して、これらのファイルを見つけることができます。

Findコマンドは、現在のディレクトリで少なくとも1バイトのサイズ(-size +1c)のすべてのファイルを収集し、grepを使用してそれらにNULL文字の繰り返しが含まれているかどうかを確認しますのみ

$ find . -type f -size +1c -exec grep -m 1 -ovP "[^\0]" {} \; 
Binary file ./empty_file with spaces.jpg matches
Binary file ./empty_file matches

Grepの-vフラグにより​​、一致しない行が出力されます。 -m 1は「最初の一致後に停止する」を意味し、-oは一致する行の部分のみを印刷することを意味し(他のファイルからの空の行の印刷を回避)、PはPerl正規表現を使用します。パターン[^\0]は、NULL以外の文字を意味します。これを逆にして(-v-m 1フラグを追加すると、ファイルにNULLしか含まれていない場合、grepは一致を報告しますのみ

最後に、これをcutsedにパイプして、一致するファイルの名前だけを出力できます。

$ find . -type f -size +1c -exec grep -m 1 -ovP "[^\0]" {} \; | cut -d ' ' -f 3- | sed 's/ matches//'
./empty_file with spaces.jpg
./empty_file
2
terdon

上記の答えは、ファイルの検査においてはるかに徹底的(そして複雑さは少ない)ですが、以下をまとめました。 NASがファイル名を処理する奇妙な方法を処理するためだけに、いくつかの追加コマンドがありますが、ファイルの最初の32バイトを取得するために 'od'を使用します(私の理論的根拠は、最初の32バイトはヌルであり、残りもヌルになる可能性があります(特に画像の場合)。

find "$(pwd)" -type f -exec sh -c 'file=$(echo "{}" | sed "s/([\(\)])/\\\1/g"); check=$(od -N32 -w32 -x "$file"); if echo $check | grep --quiet " 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000"; then echo "$file" $check; fi' \;

破損していると思われるフォルダのサブセットでこれを試し、結果をファイルに保存しました。手作業で各ファイルをチェックした後、私はそれが信頼できることにかなり満足しました。

0
inflammable