批量重命名目录以将年份从末尾移至开头

批量重命名目录以将年份从末尾移至开头

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

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

有谁能帮助我挽救我可怜的指尖吗?

一些例子:

Aes Dana - Memory Shell - 2004 
Anja Schneider & GummiHz - Back To Back (Remixes Part 2) - 2009

会成为

2004 - Aes Dana - Memory Shell
2009 - Anja Schneider & GummiHz - Back To Back (Remixes Part 2)

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

答案1

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

rename -n 's/(.*) - (\d{4})\//$2 - $1/' */

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

解释

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

答案2

简单的 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

脚本内容:

#!/usr/bin/env python
from shutil import move;
import sys

for i in sys.argv[1:] :
    parts = i[:-1].split('-')
    year = parts[-1].strip()
    new_name = year + " - " + " - ".join(parts[:-1]).strip()
    move(i,new_name)

工作原理:

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

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

相关内容