![搜索所有包含 0 个文件的子目录](https://linux22.com/image/922412/%E6%90%9C%E7%B4%A2%E6%89%80%E6%9C%89%E5%8C%85%E5%90%AB%200%20%E4%B8%AA%E6%96%87%E4%BB%B6%E7%9A%84%E5%AD%90%E7%9B%AE%E5%BD%95.png)
我想打印所有包含零个文件的子目录的名称(它们可能包含子目录)。以下内容适用于当前目录:
$ ls -p | grep -v / | wc -l | \
xargs -I % test % -eq 0 && pwd
我认为可能存在更优雅的解决方案,有什么建议吗?我该如何将其更改为递归遍历所有子目录?
我有一个测试结构:test/test1/test4 和 test/test2/test3/test5。唯一的文件在 test/test1 中。我想在基础目录 (test/) 中运行该命令。结果应该是:test/;test/test2/;test/test2/test3/,因为这些目录只包含子目录而不包含文件。其他可接受的目录是空端点 test/test1/test4/ 和 test/test2/test3/test5。
答案1
使用 fgrep 过滤掉包含文件的目录:
$ find -type d | \
grep -xFv -f <(find -type f -printf %h\\n)
答案2
像这样:
find . -type d -exec bash -c 'files=$(find $1 -mindepth 1 -maxdepth 1 -type f | wc -l) ; [[ $files -ne 0 ]] && exit 1 ; exit 0' script {} \; -print
这bash -c ...
只是一个“小”脚本,在检查目录中的文件后返回 0 或 1。
答案3
解决这个问题的不同方法:
# Enable advanced glob
shopt -s globstar
# Enable matching hidden files (.*)
shopt -s dotglob
for d in **/; do
nofiles=true
for f in "$d"/*; do
[ -f "$f" ] && nofiles=false && break
done
[ $nofiles = true ] && echo "$d"
done
shopt -u globstar
shopt -u dotglob
循环遍历所有文件夹,循环遍历其中的所有项目并检查文件。
虽然不是最短的脚本,但不会因文件名中的换行符、空格或类似字符而出错。而且,5 年后再次查看时,也很容易阅读 ;-)