我需要制作一个使用 jq 重命名以下 mp4 文件的 shell 脚本。 (可以使用 jasonpipe 但不知道如何在 mac 上安装它)
文件已下载:
- 标题1-1000221327.mp4
- title1-1000221327.info.json
- 标题1-1000221328.mp4
- 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
不支持格式化输出,因此我们将创建一个调用解析的printf
shell 循环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数组中的字符串)\;