私の目標はとても簡単です。大きなディレクトリにあるすべてのファイル/ディレクトリの小さなデータベースを作成したいと思います。
適切なツールを検索したところ、良いツール以外には何も見つかりませんでしたdu
。-b
ファイルが実際に持っているバイト数が必要で、すべてのファイルを一覧表示するには-a
。途方もない。
du
これで問題は、出力にディレクトリを含めたくないことです。各ファイルに次のような出力があることを願っています。size<tab>filename
これにより、CSVや一種のデータベースに変換できます。ディレクトリを含む問題は、データベースに変換/インポートした後にディレクトリをファイルから分離する方法を知らず、誤ってファイルをディレクトリにしたり、その逆を終了したくないことです。また、ディレクトリ内のすべてのファイルを合計するとすでにディレクトリ全体のサイズが取得されており、その上にディレクトリ全体のサイズを追加すると、使用されたスペース全体を誤って計算しすぎることはありません。それはとても良いです。
だから私は使いたくありませんfind -type f
...
$ time find -mindepth 1 -type f -exec du -sb {} > /dev/null \;
real 0m45.631s
user 0m25.807s
sys 0m18.946s
$ time du -ab > /dev/null
real 0m0.154s
user 0m0.057s
sys 0m0.096s
私は元の目標を達成するための他の方法の提案を歓迎します。問題のファイルシステムを実際にマウントせずにディレクトリを「参照して」サイズ(および含まれるファイルのサイズ)を確認する方法が必要です。 (一種の「オフライン」Baobabに似ていると言える)
答え1
du
ファイルサイズではなくファイルのディスク使用量が報告されることに注意してください(--apparent-size
オプションのGNU実装du
(または-b
短い他のGNU拡張子--apparent-size --block-size=1
)を使用しない限り)。
また、ファイル名の,
、TAB、改行、またはその他の文字は、Unix系システムと同様に有効です。"
GNUシステムでは、次のことができます。
find . ! -type d -printf '%s,%P\0' |
LC_ALL=C sed -z 's/"/""/g; s/,/,"/; s/$/"/' |
tr '\0' '\n'
ディレクトリタイプを除くすべてのファイルのサイズをCSV形式で出力して報告します。
find
上記でNUL区切りのレコードを出力するように指示しました<size>,<filepath>
。 0はファイル名には現れない唯一のバイトだからです。ロケールはsed
NULレコードモード()を使用して-z
これを処理しますC
(再び、これはユーザーのロケールで有効な文字を形成しないバイト値を含むすべてのバイト値"
を""
処理できます)。"
レコードの最初の項目の後に()を追加し、最後に()を追加します。,
<size>
$
tr
NLはCSVのレコード区切り文字であるため、この出力のNULをNLに変換します。たとえば、という15バイトのファイルは次$'a\nb"c'
のようにレンダリングされます。
15,"a
b""c"
これが実際に必要なディスク使用量であれば、それを512バイトまたはキロバイト単位のディスク使用量%s
に置き換えることができます。%b
%k
GNUシステム(GNU拡張機能)ではない場合は、次のものを-printf
使用-z
できますperl
。
find . ! -type d -print0 |
perl -l -0ne '
if (@s = lstat$_) {
s/"/""/g; print qq($s[7],"$_")
} else {warn "$_: $!\n"}'
(-print0
これはGNU拡張ですが、最近は他のほとんどの実装find
に表示されます。そうでない場合は使用できます-exec printf '%s\0' {} +
)。
今回は512バイトのディスク使用量をご希望の場合は交換してください7
。12
それにもかかわらず、ディレクトリ(ファイル名のリストとinodeへのマッピングを含む特別な種類のファイル)自体にサイズがあることに注意してください。インスタンスが報告するディレクトリの累積ディスク使用量は、ディレクトリがdu -s some-dir
繰り返し参照するすべての一意のファイル(ディレクトリを含むすべての種類)のディスク使用量にディレクトリ自体のサイズを加えた合計です。
ここでdu
操作を手動で実行し、同じサイズを報告できるようにするには、ディレクトリファイルのディスク使用量/サイズも記録する必要があり、同じファイルにファイルが複製されたとき(複数のファイルがある場合)に記録する必要があります。ファイル名、別名ハードリンク)。したがって、サイズ/ディスク使用量とファイルパスに加えて、%D:%i
ファイルの一意の識別子であるファイルデバイスとinode番号()も記録する必要があります。これにより、du
両方のファイルパスが同じファイルを参照しているかどうかがわかります。
ファイルの種類を記録することもできます。そして目次さまざまな種類のファイルの1つだけです。しかも定期的な文書、シンボリックリンク、先入選出、装備、ソケット...(%y
)。