これらのファイルを識別できるLinuxコマンドラインコマンドは何ですか?
AFAIKfind
コマンド(またはgrep
)はマッチテキストファイルの特定の文字列です。しかし、全体の内容を一致させたいです。つまり、どのファイルが正規表現と一致するかを確認したいと思います\0+
。行終端を無視します。。おそらくこのfind . cat | grep
イディオムはうまくいくかもしれませんが、grepが行を無視する方法(そしてファイルをバイナリとして扱う方法)がわかりません。
背景:数日ごとにラップトップが停止すると、btrfsパーティションから情報が失われます。書き込み用に開いているファイルの内容はゼロに置き換えられます(ファイルサイズはほぼ同じままです)。私は同期を使用し、これらの偽のファイルが広がることを望んでいません。バックアップからインポートできるようにそのファイルを識別する方法が必要です。
答え1
grep
Perl正規表現パターンを使用して␀文字を取得できます。
$ 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
ファイルが希薄であると疑われます。つまり、割り当てられたディスク容量がなく、ファイルサイズのみを指定します(du
0が報告されます)。
この場合、GNU findを使用して次のことができます(ファイルパスに改行文字が含まれていないと仮定)。
find . -type f -size +0 -printf '%b:%p\n' | grep '^0:' | cut -d: -f2-
答え4
ヌル文字 "\0" と改行文字 "\n" のみを含むファイルを探します。 ~へ
q
sedその行に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