如何使用Bash脚本在我的工作目录中查找至少包含非零字节文件的所有目录?这个:
find . -maxdepth 1 -type d -size +1c | sort
似乎不起作用
答案 0 :(得分:3)
这个怎么样:
find . -maxdepth 2 -type f -size +1c -exec dirname {} \; | sort | uniq
这更深入一层,寻找非空文件,然后获取父目录 它找到的任何东西,然后删除重复。
答案 1 :(得分:1)
不确定是否完全理解。如果我有./lvl1/lvl2/file(文件非空)并且lvl1只包含空文件和目录lvl2,那么lvl1是否应该出现在输出中?
我以为你想要它。认为这有效:
find . -mindepth 2 -type f -size +0 | cut -d/ -f2 | uniq
查找工作目录的所有子目录中的内容,以查看其中是否存在非空文件。我们只看到感兴趣的关卡名称。 uniq,因为目录不太可能只包含1个非空文件。
编辑:放慢速度的最大的事情可能是(没有做任何测试lol)在找到大小> 0的文件之后发现继续查找目录(我们应该能够停止查看这一点) 。可以在每个子目录上调用find,然后在看到第一个匹配时找到exit。for DIR in `find . -mindepth 1 -maxdepth 1 -type d`; do
find "$DIR" -type f -size +0 -print -quit
done | cut -d/ -f2
可以在这里放弃对uniq的调用(因为每个顶级目录只有1个结果)。我不认为做任何事情来摆脱削减将有很大帮助。
另一件事是你可能想要改变它看着常规文件,而不是看目录或其他东西(它会跳过一堆东西)。呃,而不是“-type f”考虑使用“!-type d”
即将入睡所以我完全有可能错过了某些东西/做了一些愚蠢的事情xD
答案 2 :(得分: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