我想获取目录树的磁盘使用情况,不包括以“.”开头的分支,并且我最终希望通过 ssh 运行它,所以我宁愿不使用管道。当我运行以下命令时,我会得到所有目录的列表:
> /bin/find . \( -name .[^.]\* -prune \) -o \( -type d -exec /bin/echo -sh {} + \)
-sh ./dir-1 ./dir-2 ./dir-3 [...]
当我单独运行 du 时,我得到了预期的输出:
> /bin/du -sh ./dir-1 ./dir-2 ./dir3 [...]
11M ./dir-1
254K ./dir-2
15M ./dir-3
[...]
当我将两者结合起来时,我只得到总行:
> /bin/find . \( -name .[^.]\* -prune \) -o \( -type d -exec /bin/du -sh {} + \)
1.4G .
顺便说一句,我正在运行 Oracle Linux Server 版本 7.9 和 GNU bash,版本 4.2.46(2)-release (x86_64-redhat-linux-gnu)
答案1
总结时,du
只对目录计数一次 - 所以
du -sh . somedir
只会显示.
,因为somedir
占了.
。顺序很重要,所以
du -sh somedir .
将同时显示somedir
和.
,并且不somedir
计入.
。
您的find
命令最终包括.
,所以这就是您所看到的,因为它首先出现。您可以通过指定最小深度来避免这种情况;然后您将看到当前目录下所有目录的总计。
如果这就是你想要的,那么
du -sh */
将产生相同的结果,而不使用find
.
如果您想要详细的、每个目录的输出,您需要告诉find
以深度优先列出目录;-prune
那么不起作用,但是对路径进行过滤可以:
find . -mindepth 1 -depth -type d \! -path '*/.*' -exec du -sh {} +
(请注意,隐藏目录的大小仍将计入任何非隐藏父目录的大小。)
如果您du
支持--exclude
,您可以使用它来达到相同的效果:
du -h --exclude '*/.*' ./