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


11

我目前正在处理一些音乐文件夹。我曾经决定按照以下模式命名它们: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。虽然每个目录都有 -分隔符。


2
请添加一些示例目录名称和预期输出。
muru

例如:我有“ Aes Dana-Memory Shell-2004”,我想拥有“ 2004-Aes Dana-Memory Shell”
TazMayhem

1
您确实知道如何编辑问题,那么为什么不将其添加到问题中呢?另外,专辑或歌手姓名中是否有-
muru

名称是否按定义由“-”定界符排列,并且名称中是否可能出现其他名称?
雅各布·弗利姆

我倾向于将源文件夹重定向到文本文件,然后使用vim。我创建了一个宏,以正确的顺序为每行与源文件夹的相关组件创建第二个参数,然后使用另一个宏将mv置于每行的开头。如果我弄乱了/丢失了文件夹,我什至可能会先复制文件夹结构。

Answers:


16

假设您可以访问perl rename(通常在Ubuntu中可用-感谢@Serg阐明了两者之间的区别。如有疑问,请致电/usr/bin/rename,您应该选择正确的一个),您可以使用:

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

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

说明

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

3
也许*/只匹配目录。
muru

@muru似乎不起作用!我在干嘛?
赞纳

1
@Zanna我稀疏他们所指的事实是,有些外壳像这样mksh具有内置的rename。用完整的路径替换它或调用prenamePerl重命名就足够了
Sergiy Kolodyazhnyy

1
@Zanna发现了一个有趣的地方:unix.stackexchange.com/a/229248/85039 TL; DRrename不是“有时称为prename”,但显然它们是同一脚本的两个“分支”,一个未维护由Debian,另一个是。是的 。。。这是一团糟-有些shell拥有自己的renameperl软件包,也有renamedebian本身提供单独的软件包
Sergiy Kolodyazhnyy

1
@Zanna我在想该方案被称为rename.ulunix.stackexchange.com/q/229230/21167
zwol

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

脚本内容:

#!/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 */

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.