批量重命名目录以将年份从年底移动到年初

Taz*_*hem 12 command-line bash regex directory batch-rename

我目前正在努力处理一些音乐文件夹。我曾经决定按照以下模式命名它们:artist - album - year. 我今天意识到这不是一个聪明的举动,现在想要按照模式命名我的目录:year - artist - album因为它们会在列出时按升序显示。

我开始手动重命名,但是,大约有 700 个文件夹,必须有一种更简单的方法;我尝试使用,gprename但我不太擅长正则表达式和 bash 脚本...

有没有人可以帮助我饶恕我可怜的指尖?

一些例子:

Aes Dana - Memory Shell - 2004 
Anja Schneider & GummiHz - Back To Back (Remixes Part 2) - 2009
Run Code Online (Sandbox Code Playgroud)

会成为

2004 - Aes Dana - Memory Shell
2009 - Anja Schneider & GummiHz - Back To Back (Remixes Part 2)
Run Code Online (Sandbox Code Playgroud)

编辑:某些艺术家和专辑名称具有特殊字符,如And.IdKool & The Gang。虽然每个目录都有 -作为分隔符。

Zan*_*nna 17

假设您可以访问 perl rename(通常在 Ubuntu 中可用 - 感谢 @Serg 澄清差异。如果有疑问,请致电/usr/bin/rename,您应该得到正确的),您可以使用:

rename -n 's/(.*) - (\d{4})\//$2 - $1/' */
Run Code Online (Sandbox Code Playgroud)

-n测试后删除以实际重命名目录。这假设所有专辑的日期都在 1000 到 9999 之间。可能是合理的......

解释

  • s/old/new替换oldnew
  • (.*)保存任意数量的任何字符以供$1以后参考
  • (\d{4})\/在行尾保存四位数字以供$2稍后参考。
  • */ 匹配所有目录(不是文件 - 感谢@muru 的帮助!)

  • 也许做`*/` 只匹配目录。 (3认同)

Ser*_*nyy 6

简单的 Python 脚本可以完成这样的工作:

$ tree
.
??? Aes Dana - Memory Shell - 2004
??? Anja Schneider & GummiHz - Back To Back (Remixes Part 2) - 2009
??? rename_dirs.py

2 directories, 1 file
$ ./rename_dirs.py */
$ tree
.
??? 2004 - Aes Dana  -  Memory Shell 
??? 2009 - Anja Schneider & GummiHz  -  Back To Back (Remixes Part 2) 
??? rename_dirs.py
Run Code Online (Sandbox Code Playgroud)

脚本内容:

$ tree
.
??? Aes Dana - Memory Shell - 2004
??? Anja Schneider & GummiHz - Back To Back (Remixes Part 2) - 2009
??? rename_dirs.py

2 directories, 1 file
$ ./rename_dirs.py */
$ tree
.
??? 2004 - Aes Dana  -  Memory Shell 
??? 2009 - Anja Schneider & GummiHz  -  Back To Back (Remixes Part 2) 
??? rename_dirs.py
Run Code Online (Sandbox Code Playgroud)

这是如何工作的:

  • 主要技巧是我们从目标所在的同一目录执行脚本。我们还传递*/只提供目录作为脚本的参数
  • 该脚本遍历所有命令行参数,将每个文件名分解为字符处的字符串列表-。新文件名由我们提取的部分构成。
  • move()来自shutils模块的函数实际上是重命名目录

注意用法: ./rename_dirs.py */