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

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

日付を含むビデオファイルがたくさんあります。 "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

(出力なし)

答え2

zsh代わりに使用してくださいbash

autoload -Uz zmv # best in ~/.zshrc
zmv -n '(**/)(* )(<1900-2021>)(.mkv)' '$1$2($3)$4'

満足すれば削除-n(テスト実行)します。

その<1900-2021>範囲の 10 進数は、構成される桁数に関係なく一致します。たとえば、一致したくない場合00002000(ファイル名でこれらの一連の数字を見つけることができます)(<1900-2021>)に変更して、4文字に制限することができます(<1900-2021>~^????)。つまり、~ とは別にオペレーターと^ いいえ1の後に????4つの文字が続きます。

答え3

パターンが常に<space>dddd.mkv(d = 数値)であると仮定すると、次のようにできます。

ファイル名の例

a 1986 filename 1981.mkv
filename 1981.mkv

パスワード:

for i in *.mkv; do
  echo "${i% [0-9.]*} (${i: -8:4}).mkv"
  # the below command will change the names
  # try with `echo` to check discrepancies in the file names
  # mv -- "$i" "${i% [0-9.]*} (${i: -8:4}).mkv"
done

a 1986 filename (1981).mkv
filename (1981).mkv

関連情報