使用 jq 根據 JSON 內容重命名文件
我需要製作一個 shell 腳本,它使用 jq 來重命名下面的 mp4 文件。(可以使用 jasonpipe 但不知道如何在 mac 上安裝)
文件下載:
- 標題1-1000221327.mp4
- 標題1-1000221327.info.json
- 標題1-1000221328.mp4
- 標題1-1000221328.info.json
我想通過從上面的相應 json 文件(2&3)中提取來重命名文件 1&3:
- “系列”:“節目名稱”,作為節目名稱
- “season_number”:1,作為“S01”
- “episode_number”:6,作為“E006”
- “title”: “title1”, 作為title1
還要在這四個變數“”-“”之間插入空格&-
重命名文件後應該是:
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我的問題是基於這個問題: Rename files based on JSON content
我會在 Linux 中使用 find 命令來獲取文件名並解析它,將文件移動到從 jq 呼叫的新文件名中。
我希望我明天可以為你寫一個例子。
(我的英語不是最好的)
希望對您有所幫助
丹尼普
編輯:將其與以下命令一起使用:find(您的文件路徑)-type f -name“*.mp4”-exec mv {}(您的文件的新路徑)(jq數組中的字元串);
我將假設我們正在處理單個目錄(目前目錄)中的文件,並且所有 JSON 文件在格式和內容方面都是*正確的。*我還假設我們的外殼是
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
該循環還構造了需要重命名的文件的預期名稱。如果該名稱不存在,則會列印一條診斷消息,並且循環只是跳到下一個名稱。
在實際重命名文件之前,會對新名稱進行基本的完整性檢查,以確保它實際上已設置為某個值,並且新名稱尚未被其他文件佔用。