Awk

使用 jq 根據 JSON 內容重命名文件

  • August 7, 2021

我需要製作一個 shell 腳本,它使用 jq 來重命名下面的 mp4 文件。(可以使用 jasonpipe 但不知道如何在 mac 上安裝)

文件下載:

  1. 標題1-1000221327.mp4
  2. 標題1-1000221327.info.json
  3. 標題1-1000221328.mp4
  4. 標題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

該循環還構造了需要重命名的文件的預期名稱。如果該名稱不存在,則會列印一條診斷消息,並且循環只是跳到下一個名稱。

在實際重命名文件之前,會對新名稱進行基本的完整性檢查,以確保它實際上已設置為某個值,並且新名稱尚未被其他文件佔用。

引用自:https://unix.stackexchange.com/questions/516045