使用正则表达式在 linux 中重命名文件

Osa*_*IRY 11 linux rename regex

我有一组我想一直重命名的文件,这些文件被命名为

"System-Log-01-01-2009-NODATA.txt"
"Something-Log-01-01-2009-NODATA.txt"
Run Code Online (Sandbox Code Playgroud)

我希望它们是小写的,yyyymmdd,.log 扩展名

"system.20090101.log"
"something.20090101.log"
Run Code Online (Sandbox Code Playgroud)

Osa*_*IRY 15

我曾经编写 perl 脚本来做到这一点,直到我发现了 rename 命令。

它接受一个 perl 正则表达式来进行重命名:

为此,我只输入了两个命令:

rename 's/(\w+)-(\w+)-(\d\d)-(\d{4})-NODATA.txt\$1.$4$3$2.log$//' *
rename 'y/A-Z/a-z/' *.log
Run Code Online (Sandbox Code Playgroud)

但是,对于某些发行版,rename没有此功能(请参阅其手册页),您可能必须安装perl-renameprename.

  • 请注意,某些发行版发布了一个毫无价值的重命名命令。检查您的发行版首先拥有哪个发行版。 (8认同)
  • 在 Arch Linux 上,这是 `perl-rename`。 (5认同)

Ham*_*ner 7

mmv是一个标准的 linux 实用程序,用于移动/重命名多个文件。对于大多数发行版,它都可以从 repos 中获得。对于上面的示例,您可以执行以下操作:

mmv '*-Log-*-*-*-NODATA.txt' '#l1.#4#3#2.log'
Run Code Online (Sandbox Code Playgroud)

有关更多信息,请阅读这篇debaday 文章手册页


小智 6

由于我没有重命名命令,因此我依赖于此:

for myfile in /my/folder/*; do
    target=$(echo $myfile|sed -e 's/foo/bar/g')
    mv "$myfile" "$target"
done
Run Code Online (Sandbox Code Playgroud)


Den*_*aia 5

renameutil 不是很“标准”。每个发行版都附带不同的rename工具。例如,在 Gentoo 上,rename来自sys-apps/util-linux包并且不支持正则表达式。

Hamish Downer建议mmv,它似乎很有用,特别是在脚本内部使用。

另一方面,对于一般情况,您可能需要renameutils。它有qmvqcp命令,它将打开您选择的文本编辑器(我的偏好:Vim)并允许您在那里编辑目标文件名。保存并关闭编辑器后,qmv/qcp将进行所有重命名。

双方mmvqmv都足够聪明,重命名以正确的顺序文件,并检测圆形重命名,并在必要时会自动创建一个临时文件。