如何查找特定文件包含指定文本的目录并编写对应sh处理脚本
实现方案
方案1:完整shell脚本实现(支持自定义后续操作)
你原有的命令可以进一步优化,避免多余的管道调用,同时兼容路径带空格、特殊字符的场景,完整脚本示例如下:
#!/bin/bash # 自定义配置参数 SEARCH_ROOT="/var/www" TARGET_FILE="composer.json" SEARCH_CONTENT='"foo-bundle"' MAX_DEPTH=2 # 遍历查找匹配的文件并提取目录 find "$SEARCH_ROOT" -maxdepth "$MAX_DEPTH" -type f -name "$TARGET_FILE" -print0 | while IFS= read -r -d '' file; do # 静默判断文件是否包含目标文本,不输出匹配内容 if grep -qi "$SEARCH_CONTENT" "$file"; then # 提取目标文件对应的目录 target_dir=$(dirname "$file") echo "匹配到符合条件的目录:$target_dir" # 在这里写你需要执行的后续操作,示例如下: # 进入目录执行composer更新:cd "$target_dir" && composer update # 备份目录:cp -r "$target_dir" /data/backup/ fi done
使用前给脚本加执行权限:chmod +x search_dir.sh,直接执行即可。
方案2:单行命令直接输出匹配目录
如果你只需要先拿到所有符合条件的目录列表,再单独做后续处理,可以直接用以下单行命令:
find /var/www -maxdepth 2 -type f -name "composer.json" -exec grep -qi '"foo-bundle"' {} \; -exec dirname {} \;
该命令会直接逐行输出符合条件的目录路径,你可以把结果重定向到文件保存,或者管道传给其他命令处理。
注意事项
- 所有变量和路径都用双引号包裹,避免路径中存在空格、特殊字符导致命令执行异常
- grep的
-i参数代表忽略大小写匹配,如果你需要严格区分大小写匹配可以去掉该参数 maxdepth参数可以根据你的实际查找深度调整,如果需要遍历所有层级的子目录可以直接删除该参数
内容的提问来源于stack exchange,提问作者Manolo
相关产品推荐
相关产品推荐

