使用 jq 根据 JSON 内容重命名文件

使用 jq 根据 JSON 内容重命名文件

我需要制作一个使用 jq 重命名以下 mp4 文件的 shell 脚本。 (可以使用 jasonpipe 但不知道如何在 mac 上安装它)

文件已下载:

  1. 标题1-1000221327.mp4
  2. title1-1000221327.info.json
  3. 标题1-1000221328.mp4
  4. title1-1000221328.info.json

我想通过从上面提取相应的 json 文件(2 和 3)来重命名文件 1 和 3:

  • "series": "ShowName", 作为 ShowName
  • “season_number”:1,如“S01”
  • “episode_number”:6,如“E006”
  • "标题": "标题1", 作为标题1

还在这四个变量之间插入空格&-“”-“”

重命名后的文件应该是:

ShowName - S01E006 - title1.mp4

“title1-1000221327.info.json”的内容

编辑:感谢您的提示:到目前为止解决了 jq 部分

jq '"\(.series) - S0\(.season_number)E00\(.episode_number) - \(.title).mp4"'
{
"description": "Bla Bla Bla",
"episode": "title1",
"episode_number": 6,
"season": "Chapter 1",
"season_number": 1,
"series": "ShowName",
"title": "title1",
"upload_date": "20181006"
}

PS我的问题是基于这个问题: 根据 JSON 内容重命名文件

答案1

我假设我们正在处理单个目录(当前目录)中的文件,并且所有 JSON 文件都是正确的在格式和内容方面。我还假设我们的 shell 是bash.

看起来您正在尝试手动对季号(两位数)和剧集号(三位数)进行整数零填充。我们可以使用格式更正确地做到这一点printf,但jq不支持格式化输出,因此我们将创建一个调用解析的printfshell 循环jq一个 shell 命令当评估时,它会创建一个newname具有正确新文件名的 shell 变量。

for name in *.info.json; do
    oldname=${name%.info.json}.mp4

    if [ ! -e "$oldname" ]; then
        printf 'No such file "%s"\n' "$oldname" >&2
        continue
    fi

    unset newname
    eval "$(
        jq -r '[
            "printf", "-v", "newname", "%s - S%.2dE%.3d - %s.mp4",
            .series, .season_number, .episode_number, .title
        ] | @sh' -- "$name"
    )"

    if [ -z "$newname" ] || [ -e "$newname" ]; then
        printf 'Can not rename "%s" to "%s"\n' "$oldname" "$newname" >&2
        continue
    fi

    mv -- "$oldname" "$newname"
done

对于给定的 JSON 示例文件,jq此循环中的命令将创建字符串

'printf' '-v' 'newname' '%s - S%.2dE%.3d - %s.mp4' 'ShowName' 1 6 'title1'

引用由@sh操作符完成,这使得在 shell 中使用 进行评估变得安全eval

此 shell 命令将在 中创建包含以下内容的bash变量newname

ShowName - S01E006 - title1.mp4

该循环还构造需要重命名的文件的预期名称。如果该名称不存在,则会打印一条诊断消息,并且循环会直接跳到下一个名称。

在实际重命名文件之前,会对新名称执行基本的健全性检查,以确保它实际上已设置为某些内容,并且新名称尚未被其他文件占用。

答案2

我将使用 Linux 中的 find 命令来获取文件名并解析它,将文件移动到从 jq 调用的新文件名。

我希望明天能为你写一个例子。

(我的英语不是最好的)

希望对您有所帮助

丹尼普罗格

编辑:与以下命令一起使用:find(文件的路径)-type f -name“*.mp4”-exec mv {}(文件的新路径)(jq数组中的字符串)\;

相关内容