Bash
在文件名中封裝日期
我有大量包含日期的影片文件;“文件名 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
(無輸出)