开发工具 碉堡了,linux 下的 rename 支持正则表达式!

limpid · 2013年02月22日 · 最后由 lzjun567 回复于 2016年12月23日 · 17982 次阅读

对于批量去除文件名字结尾的.bak, 自己经历了几个阶段: 1 最早自己用 linux 时,批量改文件似乎是用 shell 脚本来改 2 慢慢的发现可以用管道含有 awk 的命令行来做 3 后来发现可以用带 while 的命令行来做: ls *.bak | while read a; do mv $a ${a%.bak}; done 4 后来发现个好用的命令 xargs,这几年一直都是这样用的: ls *.bak | sed 's/.bak$//' | xargs -n 1 -i mv {}.bak {}

今天偶然点开个网页,发现 rename 竟然支持正则表达式批量改名(perl 形式的正则表达式)!!! 所以就非常简单了,rename 's/.bak//' *.bak 另外,更强大的是,比如有需求,把 aba, aca 这样的文件,变成 a_b_a, a_c_a 用 rename 也非常简单:rename 's/a([a-z])a/a_$1_a/' a?a

哎,又一次深刻体会了一个道理:很多好东西(工具,或规律),总是存在的,只是自己没有发现。一旦你发现这个工具(或规律),做事情就会变大事半功倍

那你体会还不够深刻,你应该想到,为什么不自己写一个工具解决自己的问题,而不是等待别人的工具。。Ruby 是写这类工具最好的脚本语言。

If you ever run rename you will see this...... Usage: rename [-v] [-n] [-f] perlexpr [filenames]

@iBachue ,恩,对常用的功能,如果需要是要写成脚本的。只是这个功能以前用上面那些命令,都可以解决问题,所以就惯性那样用了。另外,我最后想说的可能没表达清楚,我的意思是客观上存在有更好的轮子,我们手头用的轮子不够好,需要自己多学习和了解,找更好的。当然,不能满足自己的需求后,才造自己的轮子。 @blacktulip , 是的,这个是自己要反思的

你上面这些命令是可以解决问题,但是太长了不觉得嘛。命令太长也是自己做工具的理由啊。总之我一般在找到更好工具之前,都比较喜欢用自己做的工具哈哈

从这个角度上说,是这样的,呵呵

你发现的是 perl-rename,很多发行版默认的 renameutil-linux 里很弱的那个 rename,比如 Archlinux

Archlinux 可以装 perl-rename 这个包。Mac 下可以用 brew 安装 rename。好久没用 Ubuntu,记得以前 Ubuntu 是 prename 这个命令。

其实不只是 s 命令,所有有效的 perl 命令都能用,文件名会作为 $_ 传入,命令执行完后的 $_ 作为新文件名。比如全部改成小写:

rename 'y/A-Z/a-z/' *

@doitian ,是的,谢谢你的回复。我用的 ubuntu 12.10,默认的 rename 就是 perl-rename

unix 和 linux 上的各种命令小工具一个很烂的地方就是参数太多,第二烂的是参数风格不一致,第三烂的是作为协同主要方式的管道缺少约束,所以用法千奇百怪......

我也记得默认的 rename 极不好用,经常达不到目的,有时候还会误删文件。

#8 楼 @fsword

第一烂,其实你应该用不了那么多,但是如果偶尔用到了,你会非常惊喜。我有过很多次类似的惊喜. 第二烂,这个真是烂.... 烂得出奇。完全是过于自由,反而失去控制的结果,还好,我经常会把一些参数包起来,让它好用一些. 第三烂,不知道需要什么约束... 也就那么有限的几种用法吧?我指的仅限于 shell 范畴,不含编程。

回楼主:

我表示,其实几乎所有情况下,rename 用不到正则表达式的。你最多不过是通过正则确定要改名的文件列表而已。这通过管道太容易了。 例如我在 shell 下,会这样使用

f 'bak$' |x rename '.bak' ''

在管道之前,可以通过各种方式搭配,来生成所需的文件列表

而 rename 也可以分多个步骤完成,man 帮助中就有示例。

@zw963 ,恩,如果只对文件的前缀和后缀做修改,用不带正则匹配的 rename 就可以完成了

rename 这个命令嘛……CentOS 和 Ubuntu 下面接受的参数不一样呢,太蛋疼了 rename .PDF .pdf *.PDF rename 's/\.PDF/\.pdf/' *

@hegwin ,是啊,呵呵,这个就是@doitian 说的问题

需要 登录 后方可回复, 如果你还没有账号请 注册新账号