Bash脚本 - 查找具有非零字节内容的目录

4

如何使用Bash脚本查找工作目录中包含至少一个非零字节文件的所有目录?这个命令:

find . -maxdepth 1 -type d -size +1c | sort

似乎不起作用。

3个回答

3
这个怎么样:
find . -maxdepth 2 -type f -size +1c -exec dirname {} \; | sort | uniq

这个过程会深入一层,查找非空文件,然后获取它们的父级目录,最后去除重复项。


不确定为什么会有效 :) - 必须确保当目录包含具有非零字节文件但仍没有文件夹时它可以正常工作 - 它并没有 :( - Mr_and_Mrs_D

1

不确定是否完全理解。如果我有./lvl1/lvl2/file(文件非空),而lvl1仅包含空文件和目录lvl2,那么lvl1应该出现在输出中吗?

我假设你希望它出现在输出中。认为这个方法可行:

find . -mindepth 2 -type f -size +0 | cut -d/ -f2 | uniq

在工作目录的所有子目录中查找以查看其中是否有任何非空文件。进行剪切,以便我们只看到感兴趣的级别名称。uniq,因为一个目录只包含1个非空文件的可能性很小。

编辑:最慢的事情可能是(lol没有进行任何测试),find在找到大小>0的文件后继续查找目录(此时应该能够停止查找)。可以在每个子目录上调用find,然后当find看到第一个匹配项时退出。

for DIR in `find . -mindepth 1 -maxdepth 1 -type d`; do
    find "$DIR" -type f -size +0 -print -quit
done | cut -d/ -f2

可以在此处放弃对唯一性的调用(因为每个顶级目录只会有1个结果)。 我认为做任何事情来摆脱切割都不会有太大帮助。

另一件事是,您可能希望更改它查看常规文件而不是查看目录之类的内容(它将跳过一堆东西)。 呃,考虑使用“!-type d”而不是“-type f”

即将入睡,我有可能会错过某些事情 / 干傻事 xD


实际上 - 我想检测所有大小为零字节内容的目录 - 就像右键单击> 大小= 0一样 - 无论是空的还是包含零字节文件或文件夹,都是空的或包含零字节文件等等 - 您的一行代码可以完成此工作 - 但也许我错过了一些边缘情况 - 可能仍然可以更快一些? - Mr_and_Mrs_D
感谢您的编辑!现在无法检查,但看起来没问题 - 谢谢 :) - Mr_and_Mrs_D

0

我使用这个,反转 grep 因为空目录显示为 4.0K

du -h --max-depth=0 */ | grep -v 4.0K

编辑: 不使用max-depth,并且使用summary

du -sh */ | grep -v 4.0K

请注意,如果您想包含点目录,请确保已设置。
shopt -s dotglob

仅翻译文本内容,请勿进行解释。排除空目录,但不排除只包含零字节文件的目录。 - Mr_and_Mrs_D
这些是否在隐藏目录中? - Eric Fortis

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接