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
。