コンテンツに100%NUL文字を含むファイルを見つける方法は?

コンテンツに100%NUL文字を含むファイルを見つける方法は?

これらのファイルを識別できるLinuxコマンドラインコマンドは何ですか?

AFAIKfindコマンド(またはgrep)はマッチテキストファイルの特定の文字列です。しかし、全体の内容を一致させたいです。つまり、どのファイルが正規表現と一致するかを確認したいと思います\0+行終端を無視します。。おそらくこのfind . cat | grepイディオムはうまくいくかもしれませんが、grepが行を無視する方法(そしてファイルをバイナリとして扱う方法)がわかりません。

背景:数日ごとにラップトップが停止すると、btrfsパーティションから情報が失われます。書き込み用に開いているファイルの内容はゼロに置き換えられます(ファイルサイズはほぼ同じままです)。私は同期を使用し、これらの偽のファイルが広がることを望んでいません。バックアップからインポートできるようにそのファイルを識別する方法が必要です。

答え1

grepPerl正規表現パターンを使用して␀文字を取得できます。

$ echo -ne "\0\0" > nul.bin
$ echo -ne "\0x\0" > non-nul.bin
$ grep -P "[^\0]" *.bin
Binary file non-nul.bin matches

したがって、次のものを使用できます。

for path in *.foo
do
    grep -P "[^\0]" "$path" || echo "$path"
done

答え2

私は問題の起源を見つけることについてD_Byeのコメントに同意します。

とにかく、ファイルに\0次のものしか含まれていないことを確認するには、次のように\nしますtr

<file tr -d '\0\n' | wc -c

NULL/改行文字と空のファイルの場合は0を返します。

答え3

ファイルが希薄であると疑われます。つまり、割り当てられたディスク容量がなく、ファイルサイズのみを指定します(du0が報告されます)。

この場合、GNU findを使用して次のことができます(ファイルパスに改行文字が含まれていないと仮定)。

find . -type f -size +0 -printf '%b:%p\n' | grep '^0:' | cut -d: -f2-

答え4

ヌル文字 "\0" と改行文字 "\n" のみを含むファイルを探します。 ~へ
qsedその行にNULL以外の文字が見つかると、各ファイル検索はすぐに終了します。

find -type f -name 'file-*' |
  while IFS= read -r file ;do 
      out=$(sed -n '1=; /^\x00\+$/d; i non-null
                      ; q' "$file")
      [[ $out == "1" ]] &&  echo "$file"
  done

テストファイルの生成

> file-empty
printf '%s\n' 'line1' 'line2' 'line3'      > file-with-text           
printf '%4s\n' '' '' xx | sed 's/ /\x00/g' > file-with-text-and-nulls
printf '%4s\n' '' '' '' | sed 's/ /\x00/g' > file-with-nulls-and-newlines
printf '%4s'   '' '' '' | sed 's/ /\x00/g' > file-with-nulls-only

出力

./file-with-nulls-and-newlines
./file-with-nulls-only

関連情報