如何在多个相似目录批量执行bash命令简化重复脚本
你给出的find命令语法存在错误,缺少执行动作参数,无法直接实现你要的效果,以下是两种可用的简化实现方案:
方案1:for 循环实现(最易读、易维护)
直接遍历匹配到的站点admin目录,执行逻辑和你原有脚本完全一致:
for admin_dir in /home/admin/web/*/public_html/admin/; do # 用()开启子shell执行,cd操作不会影响父shell的工作目录 (cd "$admin_dir" && /usr/bin/php cron.php) & done
方案2:使用 find 命令实现
如果偏好使用find命令,可以用以下两种正确写法:
- 配合
-exec调用子shell实现目录切换:
find /home/admin/web/*/public_html/admin/ -name 'cron.php' -type f -exec sh -c 'cd "$(dirname "{}")" && /usr/bin/php cron.php' \;
- 用find自带的
-execdir参数(自动切换到文件所在目录执行,更简洁):
find /home/admin/web -path "*/public_html/admin/cron.php" -type f -execdir /usr/bin/php cron.php \;
注意事项
- 所有方案默认都是前台执行,如果你需要和原有逻辑一样全部后台运行,在命令末尾加上
&即可 - 如果站点目录路径存在空格,一定要给变量、路径参数加双引号,避免路径解析错误
- 如果cron.php依赖相对路径加载资源,务必保证执行时的工作目录是cron.php所在的admin目录,不要直接用
php 绝对路径/cron.php的写法,避免运行异常
内容的提问来源于stack exchange,提问作者Zae
相关产品推荐
相关产品推荐

