Bash

在文件名中封裝日期

  • August 3, 2021

我有大量包含日期的影片文件;“文件名 1981.mkv”,基本上是“空格 + 日期 + .”,我想將日期括在括號中,即 - “文件名 (1981).mkv”。

  • 有些文件的文件名中有年份,有些則沒有。
  • 有些文件的文件名中有其他數字。
  • 一些文件名已經更改(手動)。

我不夠精通bash,無法自己解決這個問題,不勝感激!

假設您要重命名的文件與模式匹配*' '[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命令的 Perl 實現(有時稱為prename):

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

(無輸出)

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