You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何合并find命令条件,识别满足两类文件要求的目录?

用单个find命令定位符合条件的目录

我来帮你解决这个find命令合并的问题!你的需求是找出同时满足以下三个条件的目录:

  • 目录的任意子目录中存在core文件(包括.gz压缩的)
  • 目录下存在名称匹配log_snap_*、大小超过1k的log文件
  • log文件和core文件不在同一个子目录

先看看你原来的两个命令里的小问题:

  1. 第二个命令的-path "./SESS"范围太窄,应该匹配所有以SESS开头的目录,改成-path "./SESS*"更合适
  2. 正则表达式的写法不符合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

命令拆解说明

  1. 第一步:定位符合条件的log文件
    find ./SESS* -type f \( -name "log_snap_*" -size +1k \)
    遍历所有SESS开头的目录,找出所有名称匹配log_snap_*且大小超过1k的文件。

  2. 第二步:检查对应目录下是否存在非同子目录的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文件就停止,提升效率
  3. 第三步:提取并去重目标目录
    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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 09:58:47