次のmp4ファイルの名前を変更するには、jqを使用するシェルスクリプトを作成する必要があります。 (jasonpipeを使用できますが、Macにインストールする方法がわかりません)
ダウンロードしたファイル:
- タイトル 1-1000221327.mp4
- title1-1000221327.info.json
- タイトル 1-1000221328.mp4
- 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桁)を手動で整数ゼロパッドで埋めようとしているようです。フォーマット化を使用すると、これをより正確に実行できますが、フォーマットされた出力はサポートされていないため、解析を呼び出すシェルループを作成しますprintf
。jq
printf
jq
シェルコマンド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配列の文字列)\;