将日期封装在文件名中

将日期封装在文件名中

我有大量包含日期的视频文件; “文件名1981.mkv”,基本上是“空格+日期+。”,我想将日期括在括号中,即-“文件名(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"

该脚本不处理名称冲突。


使用命令的 Perl 实现rename(有时称为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

(无输出)

答案2

zsh而不是bash

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

如果满意,请删除-n(试运行)。

请注意,<1900-2021>无论它们由多少位数字组成,都会匹配该范围内的十进制数字。例如,如果您不希望它匹配00002000(并且有可能在文件名中找到这样的数字序列),您可以通过将 更改为 来将其限制为仅由四个字符组成的(<1900-2021>)字符(<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

相关内容