非常に奇妙な状況が発生しました。さまざまなサイズのファイルを含むファイルシステムがあり、ファイルを並べ替えると破損しているように見え、何も表示されません。
このファイルがどれだけ多いかわかりません。他のすべてのファイルとまったく同じように見えます。これまで私が見つけた最良の方法は、find . -type f | xargs wc -l
0を返すファイルを実行して検索することです。
ただし、これらのファイルの一部はサイズが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
$
cat
1MiBの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 -l
0を返します。
私たちは次のことがわかります。
- 改行文字が含まれていません(
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