duの再帰順序を変更する方法

duの再帰順序を変更する方法

以前、 の結果を並べ替えることを検討しましたが、などの結果duの提案しか表示されませんでした。sortdu | sort

これはほとんどの用途では許容されますが、ハードリンクを持つ複数のディレクトリをリストするときには特に役に立ちません。たとえば、増分バックアップがあります:

ハードリンクを二重にカウントすると、duコンテンツは次のようになります。

# du -hl --max-depth 1 /backup/saturn/ | sort -k 2
3.2G    /backup/saturn/
456M    /backup/saturn/2017-05-19
458M    /backup/saturn/2017-05-20
461M    /backup/saturn/2017-05-21
464M    /backup/saturn/2017-05-22
462M    /backup/saturn/2017-05-23
462M    /backup/saturn/2017-05-24
465M    /backup/saturn/2017-05-25

しかし、日付が付けられた各ディレクトリは他のディレクトリのファイルへのハード リンクを多数共有しているため、これらの結果は正しくありません。これは増分バックアップです。

しかし、より意味のある結果は次のようになります。

# du -h --max-depth 1 /backup/saturn/ | sort -k 2
666M    /backup/saturn/
29M     /backup/saturn/2017-05-19
53M     /backup/saturn/2017-05-20
25M     /backup/saturn/2017-05-21
40M     /backup/saturn/2017-05-22
462M    /backup/saturn/2017-05-23
14M     /backup/saturn/2017-05-24
46M     /backup/saturn/2017-05-25

これは、ディレクトリを任意の順序で評価しているため、ある日付から次の日付にかけてどれだけ変化したかについてあまり意味のない情報しか得られず、少し無意味です。

そこで、ディレクトリを評価する順序を制御する方法を探していますdu

答え1

拡大するリッジーのコメントの新しいバージョンでは、オプションduを使用してスキャンするファイルのリストを読み取ることができる--files0-fromため、次の操作を実行できます。

printf "%s\0" /backup/saturn/*/ | sort -z | du --files0-from=- -h --total

例えば:

$ du -hxd1 foo
111M    foo/2017-05-20
4.0K    foo/2017-05-19
4.0K    foo/2017-05-30
111M    foo

そして:

$ printf "%s\0" foo/*/ | sort -z | du --files0-from=- -h --total
101M    foo/2017-05-19/
11M     foo/2017-05-20/
4.0K    foo/2017-05-30/
111M    total

findglob するファイルが多すぎる場合は を使用できますprintfが、少し冗長になります。

$ find foo -mindepth 1 -maxdepth 1 -type d -print0 | sort -z | du --files0-from=- -h --total
101M    foo/2017-05-19
11M     foo/2017-05-20
4.0K    foo/2017-05-30
111M    total

関連情報