重命名从文件名开头到结尾带有年份前缀的文件

Zac*_*cks 6 command-line bash files rename

极端新手试图弄清楚如何重命名目录中的一堆文件。我有数百个媒体文件,它们都遵循相同的文件名语法:

year - title of movie.avi
Run Code Online (Sandbox Code Playgroud)

我想编写一个脚本,从文件名的开头删除年份和“-”并将其附加到末尾。最终结果:

title of movie - year.avi 
Run Code Online (Sandbox Code Playgroud)

(或类似的东西。我真的不需要破折号)

我在使用像下面这样的 for 循环时遇到的问题是,由于文件名中包含空格,因此我的脚本不断解析每个单词而不是每个完整文件名。

for file in $(ls)
Run Code Online (Sandbox Code Playgroud)

结果我还没有走得太远。

Too*_*ter 10

您可以将rename命令与正则表达式一起使用:

rename 's/(\d+) - (.*)\.avi/$2 - $1.avi/' *.avi

解释:

  • rename- 命令(您可能需要安装它)
  • s/<match>/<replacement>/(替代命令)
  • .*avi.avi在所有文件上运行上面

匹配正则表达式:

  • (\d+)匹配并捕获一组 ( $1) 的一个或多个数字
  • -匹配字面意思-
  • (.*)匹配任何内容并捕获组 ( $2)
  • \.avi匹配.avi(点被转义)

替代品:

  • $2 - $1.avi- 粘贴第二组(标题),然后粘贴破折号,然后粘贴第一组(年份),然后粘贴文件扩展名

学习正则表达式,<3 正则表达式。避免使用 bash 循环文件,因为将字符串拆分为标记很难理解并且经常令人困惑,如果您不理解某些事情,您可能会忽略它们。

  • +1 虽然恕我直言,将数字限制为 4(年)会更精确,并且捕获组中的扩展名会更便携,例如 `rename -n 's/(\d\d\d\d) - (.*)( \..*)/$2 - $1$3/' *.avi` (4认同)