货币替换
有许多 Unix 实用工具可以对文件进行修改 。在大多数情况下,可以将经过修改的内容发送到标准输出,您可以使用重定向操作符对其进行进一步的处理(使用管道“|)或捕获其中的结果(使用 > 或 >> 操作符) 。
其他的实用工具(那些通常可以一次处理许多文件的工具)可以出于安全考虑而保留原始文件,并为修改后的内容生成一个新的文件 。例如,您可以直接在命令行中使用 Perl 对文件进行处理 。以下命令:
$ perl -i.bak -pe 's/dollar(s?)/buck1/g' file.txt
将“dollar替换为“buck,将“dollars替换为“bucks 。perl -i 命令在原地对 file.txt 进行修改,而 perl -i.bak 则为原始文件建立一个副本,并在其名称后面添加 .bak,以区别于新的、经过修改的版本 。因此,如下的命令:
perl -i.bak -pe 's/dollar(s?)/buck1/g' *
将为当前目录中每个文件创建一个备份 。假设有文件 file1.txt、file2.txt 和 file3.txt,那么您将得到 file1.txt.bak、file2.txt.bak 和 file3.txt.bak 。错误操作时常发生,所以建立备份是明智之举 。
如果出现了错误,并且必须恢复原始文件,您只需输入:mv file1.txt.bak file1.txt
。但是,如果有数百个文件 需要进行重命名,那又应该怎么办呢?当然,您并不希望输入数百个单独的 mv 命令 。相反,您可以输入下面的命令:
foreach file in (*.txt)
do
mv $file.bak $file
done
它适用于一些简单的情况,如本示例中的情况 。然而,这类任务非常常见,可以使用另一种特殊的实用工具,它能够更快速地完成这项任务 。以下命令:
$ 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 将如何操作呢?让我们来看一下:
$ rename -n 'y/A-Z/a-z/' *
Aa.Txt renamed as aa.txt
aA.txT renamed as aa.txt
$ rename 'y/A-Z/a-z/' *
aA.txT not renamed: aa.txt already exists
$ ls
aA.txT aa.txt
如果您希望在进行重命名的过程中删除现有的文件,那么可以添加 -f 标志 。在这个示例中,将得到一个名为 aa.txt 的文件 。那么哪个文件是其原始文件呢?因为 rename 按照字母顺序进行处理,后面的 aA.txT 文件是现在的 aa.txt 。为什么要使用 -f 呢?如果两个文件是相同的,仅仅是名称不同,rename -f 会删除重复的文件 。
推荐阅读
- Unix系统下磁带机配置使用攻略
- UNIX操作系统的二十年发展历史
- 漫谈UNIX的文件系统
- SCO UNIX到Linux操作系统的程序移植问题
- Unix系统命令Find的基本用法介绍
- 盗掘古墓罪判多久
- 对话 UNIX: 关于 inode
- Unix服务器共享Vista磁盘目录
- UNIX 进程揭秘
- 对话 UNIX:第 2 部分: 做得多不如做得巧
