如何用find命令遍历目录,排除含xyz子目录的路径及分支?
解决方案
问题分析
你当前的命令只排除了xyz目录本身及其子路径,但没有处理父目录包含xyz子目录的情况——比如/root/test/1/foo/bar下存在xyz,那么bar的所有子目录(如bar/abc)也应该被排除,但原命令会因为bar/abc下没有xyz而错误输出。
修改后的实现
我们需要先找出所有包含xyz子目录的父目录,再排除这些父目录及其所有子分支,最后筛选出剩余目录中的最末级路径:
# 创建临时文件存储需要排除的目录 tempfile=$(mktemp) # 第一步:遍历所有目录,找出所有包含xyz子目录的父目录 find "$(pwd)" -type d -exec sh -c ' for dir do if [ -d "$dir/xyz" ]; then echo "$dir" fi done ' sh {} + > "$tempfile" # 第二步:遍历所有目录,排除上述父目录及其子目录,输出最末级路径 find "$(pwd)" -type d \ -exec sh -c ' target_dir="$1" # 检查当前目录是否在排除列表的路径范围内 while read -r exclude_dir; do if [[ "$target_dir" == "$exclude_dir" || "$target_dir" == "$exclude_dir"/* ]]; then exit 1 fi done < "$2" # 判断是否为最末级目录(无任何子目录) if [ -z "$(find "$target_dir" -mindepth 1 -maxdepth 1 -type d)" ]; then echo "$target_dir" fi ' sh {} "$tempfile" \; # 清理临时文件 rm "$tempfile"
命令说明
- 第一步:遍历所有目录,将所有包含
xyz子目录的父目录写入临时文件,这些目录是需要排除的根节点。 - 第二步:再次遍历所有目录,检查每个目录是否属于排除目录的路径范围(自身或子目录),如果是则跳过;否则判断该目录是否为最末级(无任何子目录),若是则输出完整路径。
- 最后清理临时文件,避免残留。
内容的提问来源于stack exchange,提问作者programings
相关产品推荐
相关产品推荐

