电脑技术学习

对话 UNIX,第 7 部分: 命令行惯用语

dn001
$ rename 's/.bak$//' *.bak

  执行了相同的任务。正则表达式 s/.bak$// 将命令行中列出的每个文件名后面的 .bak 删去,在本示例中是 * 或所有文件,并使用缩短后的名称作为目标文件名。

  当文件名没有什么规律时,rename 命令尤其有用。例如,可以考虑下面这个目录中的内容,它看起来像一个大学一年级新生的信件集合。

$ ls
RenT.txt bEErMoNey.txt gASmoNey.TXt

  上面的 foreach 脚本无法处理这个问题,因为这些文件名毫无规律可循。而 rename 可以轻松地对其进行处理:

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

  正则表达式 y/A-Z/a-z/ 中的 y 操作符用于进行转换。转换工作需要两个列表:一个原始字符列表和一个替换字符列表。如果这两个列表大小相同,那么在这段文本中,将原始列表中第一个字符的实例替换为替换列表中的第一个字符。换句话说,在本示例中,每个大写“A的实例都将替换为小写“a、“B替换为“b,依此类推。文本中的小写字母保持不变。

  如果您需要先对 rename 所执行的工作进行预览,那么可以添加 -n 选项。这个选项可以显示该命令所执行的工作,但并不真正地进行这些更改:

$ rename -n 'y/A-Z/a-z/' *
RenT.txt renamed as rent.txt
bEErMoNey.txt renamed as beermoney.txt
gASmoNey.TXt renamed as gasmoney.txt
$ rename 'y/A-Z/a-z/' *
$ ls
beermoney.txt gasmoney.txt rent.txt

  其中有一个缺点需要避免:在 Unix 系统中,文件名是区分大小写的。一个目录中可能包含 Aa.Txt 和 aA.txT。如上所述,可以编写一条重命名规则将区分大小写的文件名转换为小写文件名,这样可能会与以前已存在的唯一的文件名发生冲突。在这种情况下,rename 将如何操作呢?让我们来看一下:

标签: