You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 17:06:03