递归替换字符串,同时安全避免git目录

递归替换字符串,同时安全避免git目录

问题描述:

如何在当前目录和所有子目录中替换所有ABC实例与XYZ递归替换字符串,同时安全避免git目录

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' {} + 

您需要“修剪”.git目录。 Find的-prune指令总是成功,并且作为副作用,终止在目录中的搜索;并找到的or运营商短路,所以:

find $top -name .git -prune -o -type f -print0 | xargs -0 ... 

例如。这说:对于每个文件,如果名称是.git-prune成功,我们就完成了(并且-prune确实成功了,并且我们没有下降到.git)。否则,名称不是.git,所以我们执行“或”子句:如果类型是“文件”,则为-print0

因此,这将打印不是.git目录的文件的所有名称,也不打印在.git目录中。 (当然,一个.git目录也已不是一个文件,但我们不得不测试,要使用-prune。)

在这个流行问题上的答案注意,这是不明智的文件夹中运行像find /home/www -type f -print0 | xargs -0 sed -i 's/ABC/ABX/g'命令包含.git目录,因为历史记录可能会损坏。

这不仅仅是git目录,它是任何用于软件开发的东西。构建产品,数据库,测试的预期结果......像这样的命令正在乞求麻烦。

git grep -lIz ABC | xargs -0 sed -i 's/ABC/DEF/g' 

会得到你刚才跟踪的文本文件,这是一个不错的开始,并且可以提供路径模式,以及(如git grep foobar -- '*.[ch]'显示跟踪.c和.h文件所有匹配的行)