ファイルの内容が破損しているかどうかを確認すると、ファイルサイズは「0」と表示されます。

ファイルの内容が破損しているかどうかを確認すると、ファイルサイズは「0」と表示されます。

非常に奇妙な状況が発生しました。さまざまなサイズのファイルを含むファイルシステムがあり、ファイルを並べ替えると破損しているように見え、何も表示されません。

このファイルがどれだけ多いかわかりません。他のすべてのファイルとまったく同じように見えます。これまで私が見つけた最良の方法は、find . -type f | xargs wc -l0を返すファイルを実行して検索することです。

ただし、これらのファイルの一部はサイズが10 GBに達し、空であってもファイルを確認するのに1分以上かかります。約5000万個のファイルを確認する必要がありますが、これはほとんど不可能です。

最大の質問は、単純な検索を実行するよりもはるかに速くこれらのファイルの内容を調べるための低レベルの方法があるかどうかです。

答え1

そして、ファイルを検索しても何も表示されません。

cat次の実験で示すように、ファイルの出力がないということはファイルが空であるという意味ではありません。

$ truncate -s 1M foo    
$ ll foo
-rw-r----- 1 user users 1048576 Nov 15 19:28 foo
$ file foo
foo: data
$ cat foo
$ 

cat1MiBのNUL文字を出力しますが、これらの文字は端末では見えません。

空のファイルに関するあなたの質問は多少曖昧です。上記にfoo該当しますか? 「空」が長さがゼロであることを意味する場合は、find次のようにします。

find dir -type f -empty

以下の長さ0のファイルをすべて一覧表示しますdir。サポートfindしていない場合は-empty、使用できます-size 0

-s fileシェルスクリプトでは、存在し、空でない場合はtrueの式を使用できます。fileファイルが空であることを確認するには(存在すると仮定)、次のようにします。

if [ \! -s file ] ; then ... ; fi

stat(1)または、次はGNUバリアントを使用できます。

$ stat --format=%s foo
1048576

比較により、さらに使用できます。

答え2

あなたの手がかりから:

  • そのサイズはゼロまたはゼロではないと報告されます。ls -l
  • cat何も見せないようだ
  • wc -l0を返します。

私たちは次のことがわかります。

  • 改行文字が含まれていません(wc -l改行数の計算)。
  • 文字が含まれている場合、端末には表示されません。

ほとんどの制御文字、一部の拡張 Unicode 文字など端末に表示されない文字も多いですが、さまざまな文字もたくさんあります。腐敗この動作を示す文書を見ると、NUL文字かもしれません。

データブロックへの参照がすべて削除された場合、破損したファイルはすべてゼロとして扱われる可能性があります。サイズinodeのプロパティは変更されず、そのまま残ります。これは完全に希薄な文書です。

inodeのブロック数フィールドも破損しない限り、次のコマンドを使用してこれを検出できます(GNUfindとGNUと仮定awk)。

find . -size +0 -printf '%b%p\0' | awk -v RS='\0' '
  /^0/{print substr($0, 2)}'

つまり、サイズがゼロではなくディスク使用量が空のファイルを探します。

答え3

最大の質問は、単純な検索を実行するよりもはるかに速くこれらのファイルの内容を調べるための低レベルの方法があるかどうかです。

努力するdu

$ truncate -s 4G my4g
$ ls -l my4g
-rw-rw-r-- 1 tange tange 4294967296 Mar  4 15:34 my4g
$ cat my4g
$ du my4g
0       my4g

関連情報