如何在当前目录和所有子目录中用ABC
替换XYZ
的所有实例?
在this popular question中,最佳答案指出运行
等命令是不明智的find /home/www -type f -print0 | xargs -0 sed -i 's/subdomainA\.example\.com/subdomainB.example.com/g'
在包含.git
目录的文件夹中,因为历史记录可能已损坏。
因此,如何在 中包含.git
目录的文件夹中进行替换?这是怎么回事?:
find /home/www/ -type f -not -path .git/ -exec \
sed -i 's/ABC/XYZ/g' {} +
答案 0 :(得分:3)
您需要“修剪”.git
目录。查找的-prune
指令总是成功,并且作为副作用,终止目录中的搜索;并且发现or
运算符是短路的,所以:
find $top -name .git -prune -o -type f -print0 | xargs -0 ...
例如。这表示:对于每个文件,如果名称为.git
且 -prune
成功,我们就完成了(-prune
确实成功了,我们不会下降进入.git
)。否则,名称不是.git
,因此我们执行“或”子句:如果类型为“file”,则为-print0
。
因此,这将打印不是.git
目录的文件的所有名称,也不会打印在.git
目录中。 (当然.git
目录也不是文件,但我们必须测试它才能使用-prune
。)
答案 1 :(得分:1)
在这个热门问题中,最热门的答案指出,在包含.git目录的文件夹中运行
find /home/www -type f -print0 | xargs -0 sed -i 's/ABC/ABX/g'
等命令是不明智的,因为历史记录可能会损坏。
它不仅仅是git目录,而是用于软件开发的任何东西。构建产品,数据库,测试的预期结果......这样的命令就是在乞求麻烦。
git grep -lIz ABC | xargs -0 sed -i 's/ABC/DEF/g'
将为您提供跟踪的文本文件,这是一个不错的开始,您也可以提供路径名模式(例如git grep foobar -- '*.[ch]'
显示跟踪的.c和.h文件中的所有匹配行)