2016-11-12 60 views
0

如何在當前目錄和所有子目錄中替換所有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' {} + 

回答

3

您需要「修剪」.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。)

1

在這個流行問題上的答案注意,這是不明智的文件夾中運行像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文件所有匹配的行)