如何更改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

相关内容