搜索所有包含 0 个文件的子目录

搜索所有包含 0 个文件的子目录

我想打印所有包含零个文件的子目录的名称(它们可能包含子目录)。以下内容适用于当前目录:

$ 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 年后再次查看时,也很容易阅读 ;-)

相关内容