You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多
文档控制台
免费开始使用

如何用find命令在Linux系统中递归查找仅含子目录的文件夹?

用find命令定位仅包含子目录的目录

嘿,这个需求我经常遇到,完全可以用find命令结合一小段shell脚本来实现。核心思路是筛选出自身没有普通文件,但至少包含一个子目录的目录,刚好匹配你说的folder2和folder3这类场景。

方法一:逻辑清晰的find组合脚本

直接上命令,这个版本可读性强,容易调整:

find . -type d ! -path . -exec sh -c '
  target_dir="$1"
  # 统计当前目录下的普通文件数量(仅直接子层级,不递归)
  has_regular_files=$(find "$target_dir" -maxdepth 1 -type f | wc -l)
  # 统计当前目录下的子目录数量(减去自身这个目录)
  subdir_count=$(( $(find "$target_dir" -maxdepth 1 -type d | wc -l) - 1 ))
  
  # 同时满足:无普通文件 + 至少有一个子目录
  if [ "$has_regular_files" -eq 0 ] && [ "$subdir_count" -ge 1 ]; then
    echo "$target_dir"
  fi
' sh {} \;

参数解释:

  • -type d:只筛选目录类型的条目
  • ! -path .:排除当前目录(如果不需要过滤可以直接去掉)
  • -exec sh -c '...' sh {} \;:对每个找到的目录执行内嵌的shell脚本
  • -maxdepth 1:限制查找范围仅在目标目录的直接子层级,避免递归到更深的目录干扰判断

方法二:更轻量的ls+grep版本

如果觉得多次调用find有点冗余,也可以用ls配合grep来做判断,执行速度更快:

find . -type d ! -path . -exec sh -c '
  dir="$1"
  # 判断当前目录下是否没有普通文件:过滤掉目录后无剩余内容
  if ! ls -p "$dir" | grep -v "/$" | grep -q .; then
    # 判断当前目录下是否存在至少一个子目录
    if ls -p "$dir" | grep "/$" | grep -q .; then
      echo "$dir"
    fi
  fi
' sh {} \;

逻辑说明:

  • ls -p:自动给目录名添加/后缀,方便快速区分文件和目录
  • grep -v "/$":过滤掉所有目录条目,剩下的就是普通文件;grep -q .用于静默判断是否有内容,前面加!就表示“没有普通文件”
  • 第二次grep "/$"则是检查是否存在子目录,避免把空目录也匹配进来

测试示例

假设你的文件结构是这样的:

.
├── folder1
│   ├── file1.txt
│   └── subfolder1
├── folder2
│   └── subfolder2
│       └── file2.txt
└── folder3
    ├── subfolder3a
    │   └── file3a.txt
    └── subfolder3b
        └── file3b.txt

运行上面的命令后,会输出:

./folder2
./folder3

完全符合你的需求。

内容的提问来源于stack exchange,提问作者Bob Ortiz

火山引擎 最新活动