递归替换字符串,同时安全避免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文件所有匹配的行)