如何让find命令仅返回每个Tomcat路径下首个匹配的RELEASE-NOTES文件
脚本修改方案
修改后的完整代码
#!/bin/sh set -- "/opt" "/var" "/usr" # 存储已处理过的Tomcat根目录,避免重复输出 processed_tomcat="" for _i in "$@"; do find "$_i" -maxdepth 5 -name 'RELEASE-NOTES*' 2>/dev/null | while read -r found_path; do # 提取当前文件所属的Tomcat根目录(匹配tomcat开头的顶层目录) tomcat_root=$(echo "$found_path" | sed -E 's/^(.+\/tomcat[^\/]*)\/.*/\1/') # 校验当前Tomcat根目录是否已经输出过结果 if echo "$processed_tomcat" | grep -Fq "$tomcat_root"; then continue fi # 输出第一个匹配结果,标记根目录为已处理 echo "$found_path" processed_tomcat="$processed_tomcat $tomcat_root" done done
修改逻辑说明
- 修复了原脚本中
RELEASE-NOTES*未加引号的问题:避免shell在执行find前提前展开当前目录下的同名文件,导致搜索规则失效 - 新增已处理根目录标记:通过变量记录已经输出过结果的Tomcat根目录,同一根目录下的后续匹配文件会直接跳过
- 根目录识别逻辑:通过sed正则提取路径中
tomcat开头的顶层目录,可兼容tomcat、tomcat7、tomcat10等不同版本的命名规则 - 遍历顺序适配:find默认按目录层级从上到下遍历,和期望的优先输出
webapps/docs下文件的逻辑完全匹配
内容的提问来源于stack exchange,提问作者cynicalswan77
相关产品推荐
相关产品推荐

