为什么我的“find -exec du”不起作用?

为什么我的“find -exec du”不起作用?

我想获取目录树的磁盘使用情况,不包括以“.”开头的分支,并且我最终希望通过 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 '*/.*' ./

相关内容