如何合并find命令条件,识别满足两类文件要求的目录?
用单个find命令定位符合条件的目录
我来帮你解决这个find命令合并的问题!你的需求是找出同时满足以下三个条件的目录:
- 目录的任意子目录中存在core文件(包括.gz压缩的)
- 目录下存在名称匹配
log_snap_*、大小超过1k的log文件 - log文件和core文件不在同一个子目录
先看看你原来的两个命令里的小问题:
- 第二个命令的
-path "./SESS"范围太窄,应该匹配所有以SESS开头的目录,改成-path "./SESS*"更合适 - 正则表达式的写法不符合find的要求:find默认使用POSIX基本正则,而且是匹配整个文件路径,所以
*core.[0-9]+\(.gz)*需要调整为更直观的通配符匹配方式(或者修正正则语法)
最终整合命令
这里提供一个高效的实现,通过嵌套find和shell脚本关联两个条件的检查:
find ./SESS* -type f \( -name "log_snap_*" -size +1k \) -exec sh -c ' # 获取当前log文件所在的子目录 log_subdir=$(dirname "$0") # 从log子目录的父目录开始查找core文件,同时排除log所在的子目录(确保不在同一子目录) find "$(dirname "$log_subdir")" -path "$log_subdir" -prune -o -type f \( -name "core.[0-9]*" -o -name "core.[0-9]*.gz" \) -print | head -n 1 ' {} \; | awk -F/ '{print $(NF-1)}' | sort -u
命令拆解说明
第一步:定位符合条件的log文件
find ./SESS* -type f \( -name "log_snap_*" -size +1k \)
遍历所有SESS开头的目录,找出所有名称匹配log_snap_*且大小超过1k的文件。第二步:检查对应目录下是否存在非同子目录的core文件
通过-exec sh -c对每个找到的log文件执行脚本:log_subdir=$(dirname "$0"):获取当前log文件所在的子目录路径find "$(dirname "$log_subdir")" -path "$log_subdir" -prune -o ...:从log子目录的父目录开始查找core文件,用-prune排除log所在的子目录,确保找到的core文件和log不在同一个子目录head -n 1:找到第一个匹配的core文件就停止,提升效率
第三步:提取并去重目标目录
awk -F/ '{print $(NF-1)}':从找到的core文件路径中提取对应的父目录sort -u:去重,确保每个符合条件的目录只输出一次
可选调整
如果你需要输出的是顶级的SESS目录(而不是中间层级的目录),可以把最后一步的awk改成:
awk -F/ '{for(i=1; i<=NF; i++) if($i ~ /^SESS/) {print $i; break}}' | sort -u
内容的提问来源于stack exchange,提问作者user1625344
相关产品推荐
相关产品推荐

