如何使用Bash遍历目录及子目录所有文件并调用指定PHP命令处理
可行实现方案
直接使用Linux自带的find命令即可实现,它原生支持递归遍历目录,且能正确处理带空格、特殊字符的文件名,完全适配你提到的带空格的目录场景。
方案1:单行命令直接执行
如果是单次使用,直接运行如下命令即可,将示例中的./293 House Street替换为你实际的顶级目录路径,地址参数-a的值也同步修改即可:
find "./293 House Street" -type f -exec bash -c ' for file in "$@"; do php process_directories.php -a "293 House Street" -p "$(dirname "$file")" -f "$(basename "$file")" done ' bash {} +
参数说明:
-type f仅匹配文件,自动跳过目录本身- 所有变量统一包裹双引号,避免路径/文件名带空格时执行报错
$(dirname "$file")自动提取文件所在路径,对应你需要的PATH_OF_FILE参数$(basename "$file")自动提取文件名,对应你需要的FILE参数-exec ... +批量传递找到的文件给循环处理,比逐个触发命令执行效率更高
方案2:可复用脚本
如果需要经常使用,可写成通用bash脚本,不用每次手动修改参数:
- 新建
process_images.sh文件,写入以下内容:
#!/bin/bash # 参数校验 if [ $# -ne 2 ]; then echo "用法: $0 <顶级目录路径> <地址参数>" exit 1 fi TOP_DIR="$1" ADDR="$2" # 遍历执行php命令 find "$TOP_DIR" -type f -exec bash -c ' target_addr="$1" shift for file in "$@"; do php process_directories.php -a "$target_addr" -p "$(dirname "$file")" -f "$(basename "$file")" done ' bash "$ADDR" {} +
- 给脚本添加执行权限:
chmod +x process_images.sh
- 执行示例:
./process_images.sh "./293 House Street" "293 House Street"
可选优化
如果只需要处理特定格式的图片文件,可以在find命令中添加后缀过滤规则,跳过非图片文件减少无效执行,示例如下(可自行增减需要匹配的后缀):
find "$TOP_DIR" -type f \( -iname "*.jpg" -o -iname "*.jpeg" -o -iname "*.png" -o -iname "*.gif" -o -iname "*.webp" \) -exec ...
内容的提问来源于stack exchange,提问作者J.Do
相关产品推荐
相关产品推荐

