Bash批量读取歌曲EXIF数据归类脚本多文件运行失败排查
核心问题修复说明
错误点梳理
- 循环遍历逻辑错误:原写法
for song in ~/Music/+++仅会将+++目录本身作为唯一遍历对象,无法读取目录下的多个音轨文件,这是多首歌曲时脚本异常的核心原因 exiftool添加了无用的-r递归参数,处理单个音轨时不需要递归扫描,路径异常时会触发无意义遍历导致卡住- 所有变量未用双引号包裹,当艺术家、专辑、歌曲名包含空格等特殊字符时会触发命令解析错误
- 分支中存在
cp命令语法错误,缺少源路径参数会直接执行失败 - 未给
mkdir添加-p参数,创建多级目录时如果父目录不存在会报错,且提前判断目录存在的逻辑可以省略,mkdir -p会自动跳过已存在的目录 - 单次循环重复调用3次
exiftool读取元数据,可优化为单次读取后拆分赋值
修正后可正常运行的脚本
#!/usr/bin/env bash loosies='Loosies' # 遍历+++目录下所有内容,只处理文件可打开下方的判断逻辑 for song in ~/Music/+++/*; do # 跳过子目录,仅处理文件(不需要可以注释) [[ -f "$song" ]] || continue # 单次读取三个元数据字段,避免重复调用exiftool meta=$(exiftool -q -Artist -Album -Title "$song") artist=${meta#*Artist : } artist=${artist%%$'\n'*} album=${meta#*Album : } album=${album%%$'\n'*} title=${meta#*Title : } title=${title%%$'\n'*} artist_dir="$HOME/Music/Artists/${artist}" # 优先匹配专辑目录,不存在则用Loosies目录 target_dir="${artist_dir}/${album}" [[ -d "$target_dir" ]] || target_dir="${artist_dir}/${loosies}" # 自动创建所有缺失的层级目录 mkdir -p "$target_dir" # 复制文件,若你需要复制目录内容可改回 cp -r "$song"/. "$target_dir/" cp "$song" "$target_dir/" # 校验复制结果,>> 改为追加写入日志避免覆盖历史记录 if [[ -f "${target_dir}/${title}" ]]; then exiftool "$song" -Artist -Album >> ~/success.txt else exiftool "$song" -Artist -Album >> ~/fail.txt fi done
内容的提问来源于stack exchange,提问作者dankmustard
相关产品推荐
相关产品推荐

