jqを使用してJSONコンテンツに基づいてファイル名を変更する

jqを使用してJSONコンテンツに基づいてファイル名を変更する

次のmp4ファイルの名前を変更するには、jqを使用するシェルスクリプトを作成する必要があります。 (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の名前を変更したいと思います。

  • 「シリーズ」:「ShowName」、ShowNameへ
  • "season_number": 1 (例: "S01")
  • "episode_number": 6 (例: "E006")
  • 「タイトル」:「タイトル1」、タイトル1

また、これら 4 つの変数の間に &-""-"" スペースを挿入してください。

名前が変更されたファイルは次のようになります。

ショー名 - 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ファイルが次のようになっているとします。正しい形式や内容の面からです。私も私たちのシェルがbash

シーズン番号(2桁)とエピソード番号(3桁)を手動で整数ゼロパッドで埋めようとしているようです。フォーマット化を使用すると、これをより正確に実行できますが、フォーマットされた出力はサポートされていないため、解析を呼び出すシェルループを作成しますprintfjqprintfjqシェルコマンドnewname評価されると、正しい新しいファイル名でシェル変数が生成されます。

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演算子によって実行されるため、シェルで評価を安全に使用できますeval

このシェルコマンドは、次の内容を含むbash変数を生成します。newname

ShowName - S01E006 - title1.mp4

また、ループは名前を変更する必要があるファイルの推定名も構成します。名前がない場合は、診断メッセージが出力され、ループは次の名前に直接ジャンプします。

実際にファイル名を変更する前に、新しい名前に対してデフォルトの完全性チェックを実行して、実際にどの名前に設定されているか、新しい名前がすでに他のファイルで使用されていないことを確認してください。

答え2

Linuxでは、findコマンドを使用してファイル名を取得して解析し、ファイルをjqから呼び出された新しいファイル名に移動します。

明日、あなたのための例を書いてみましょう。

(私の英語は最高ではありません)

これがあなたに役立つことを願っています

ダニープロガー

編集:以下で使用されます:find(ファイルパス)-type f -name "*.mp4" -exec mv {}(ファイルの新しいパス)(jq配列の文字列)\;

関連情報