Shell 对目录中的所有文件进行文本替换,我们经常需要将目录下所有文件中的特定文本替换成其他内容。例如在网站的源文件目录中替换一个URI。

实战演练
我们可以首先使用find找到需要进行文本替换的文件,然后由sed负责完成实际的替换操作。假设我们希望将所有.cpp文件中的Copyright替换成Copyleft:
find . -name *.cpp -print0 |  \
    xargs -I{} -0 sed -i 's/Copyright/Copyleft/g' {}
工作原理
我们使用find命令在当前目录(.)下查找所有的.cpp文件。它使用-print0打印出以\0作为分隔符的文件列表(这可以避免文件名中的空格所带来的麻烦)。然后使用管道将文件列表传递给xargs,后者将文件名作为sed的参数,通过sed修改文件内容。
补充内容
回忆一下,find有一个选项-exec,它可以对查找到的每个文件执行命令。我们可以使用该选项实现同样的效果或是改用下列命令:
$ find . -name *.cpp -exec sed -i 's/Copyright/Copyleft/g' \{\} \;
或者
$ find . -name *.cpp -exec sed -i 's/Copyright/Copyleft/g' \{\} \+
尽管这两个命令效果相同,但第一个命令会为查找到的每个文件调用一次sed,而在第二个命令中,find会将多个文件名一并传递给sed。
极客教程