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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 22:15:04