如何更改du遞歸順序

如何更改du遞歸順序

我研究過對先前的結果進行排序du,並且只見過對sort結果的建議,例如du | 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

find如果需要 glob 的檔案太多,您可以使用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

相關內容