我目前正在为一些音乐文件夹而苦恼。我曾经决定按照以下模式命名它们: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.Id
或Kool & The Gang
。尽管每个目录都有 -
分隔符。
答案1
假设您可以访问 perl rename
(通常在 Ubuntu 中可用 - 感谢 @Serg 澄清了差异。如果有疑问,请致电/usr/bin/rename
,您应该会得到正确的答案),您可以使用:
rename -n 's/(.*) - (\d{4})\//$2 - $1/' */
测试后删除-n
以真正重命名目录。这假设所有专辑的日期都在 1000 到 9999 之间。可能合理...
解释
s/old/new
old
用。。。来代替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 */