ファイル名への日付のカプセル化

ファイル名への日付のカプセル化

日付を含むビデオファイルがたくさんあります。 "filename1981.mkv"(デフォルトでは "space+date+.") で、日付を括弧で囲みたいと思います (例: "filename(1981).mkv")。

  • 一部のファイルにはファイル名に年が含まれ、一部のファイルには含まれていません。
  • 一部のファイルには、ファイル名に追加の数字が含まれています。
  • 一部のファイル名が(手動で)変更されました。

私はこれを自分で理解するのに十分なbashに精通していません。助けてくれてありがとう!

ベストアンサー1

名前を変更するファイルがパターンと一致すると仮定します*' '[0-9][0-9][0-9][0-9].mkv

for name in *' '[0-9][0-9][0-9][0-9].mkv; do
    suffix=${name##* }        # remove all up to the last space of $name
    suffix=${suffix%.mkv}     # remove .mkv from end of $suffix
    suffix="($suffix).mkv"    # add parentheses and .mkv

    # Remove old suffix from $name by truncating
    # the name at the last space and then adding
    # the new suffix after a space, then rename
    # the original file.
    newname="${name% *} $suffix"

    printf '"%s" --> "%s"\n' "$name" "$newname"
    mv -- "$name" "$newname"
done

テスト:

$ ls -1
filename 1980.mkv
filename 1981.mkv
filename 1982.mkv
filename 1983.mkv
filename 1984.mkv
filename 1985.mkv
script
$ sh script
"filename 1980.mkv" --> "filename (1980).mkv"
"filename 1981.mkv" --> "filename (1981).mkv"
"filename 1982.mkv" --> "filename (1982).mkv"
"filename 1983.mkv" --> "filename (1983).mkv"
"filename 1984.mkv" --> "filename (1984).mkv"
"filename 1985.mkv" --> "filename (1985).mkv"

スクリプトは名前の競合を処理しません。


コマンドrename(時々呼び出されるprename)を使用したPerlの実装:

rename -v 's/(\d{4})\.mkv$/($1).mkv/' *.mkv

お持ちの方は参考にしてくださいその他一致するファイル*.mkv、PCREが(\d{4})\.mkv$一致しないため、このコマンドはファイル名を変更しません。

テスト:

$ rename -v 's/(\d{4})\.mkv$/($1).mkv/' *.mkv
filename 1980.mkv renamed as filename (1980).mkv
filename 1981.mkv renamed as filename (1981).mkv
filename 1982.mkv renamed as filename (1982).mkv
filename 1983.mkv renamed as filename (1983).mkv
filename 1984.mkv renamed as filename (1984).mkv
filename 1985.mkv renamed as filename (1985).mkv

再実行してもファイル名は変わりません。

$ rename -v 's/(\d{4})\.mkv$/($1).mkv/' *.mkv

(出力なし)

おすすめ記事