Mac自动执行Bash脚本文件夹空判断逻辑失效问题排查
问题根因
- macOS 默认Shell(旧版Bash/Zsh)中管道两侧命令在独立子进程运行,
find | read的退出状态无法正确传递给if判断,导致if分支永远不触发,脚本始终执行else的mv逻辑 - 原脚本未配置通配符展开规则,空目录下
*.m4a不会自动匹配为空,会作为字面量参数传给mv,触发「找不到文件」的报错
修复方案
方案1:数组匹配文件(最稳定,适合仅判断当前目录m4a文件的场景)
# 定义路径变量,避免重复硬编码 hold_dir="/Users/mikehaddon/Desktop/Network/BOPPAudioWork/M4AHoldingBin" target_dir="/Users/mikehaddon/Desktop/BOPPAudio" # 提前判断目录合法性,避免cd失败导致后续逻辑错乱 if [ ! -d "$hold_dir" ] || [ ! -d "$target_dir" ]; then exit 1 fi cd "$hold_dir" || exit 1 # 配置通配符规则:匹配不到文件时展开为空,而非保留通配符本身 shopt -s nullglob m4a_files=(*.m4a) shopt -u nullglob # 数组长度为0说明无匹配文件,直接退出 if [ ${#m4a_files[@]} -eq 0 ]; then exit 0 fi # 存在文件时执行移动,-- 用于兼容带-开头的文件名 mv -f -- *.m4a "$target_dir/"
方案2:修改find写法(适合需要递归查询文件的场景)
hold_dir="/Users/makehaddon/Desktop/Network/BOPPAudioWork/M4AHoldingBin" target_dir="/Users/mikehaddon/Desktop/BOPPAudio" # 直接判断find输出是否为空,避免管道子进程问题 # -maxdepth 1 仅查询当前目录不递归,-type f 仅匹配文件,找到第一个符合条件的文件就退出,执行效率更高 if [ -z "$(find "$hold_dir" -maxdepth 1 -type f -name "*.m4a" -print -quit)" ]; then exit 0 fi mv -f "$hold_dir"/*.m4a "$target_dir/"
内容的提问来源于stack exchange,提问作者Mike
相关产品推荐
相关产品推荐

