如何用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




