我希望获得目录树的磁盘使用情况,不包括以“.”开头的分支,而且我最终希望在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 .顺便说一下,我正在运行OracleLinuxServerRelease7.9和GNU,版本4.2.46(2)-release (x86_64-redhat- Linux -gnu)
发布于 2021-11-23 16:41:51
总结时,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 '*/.*' ./https://unix.stackexchange.com/questions/678757
复制相似问题