2013-10-29 56 views
1

關於this post,如何從應用字符串替換中排除一個或多個文件?通過使用上述帖子作爲例子,我希望能夠在給定目錄的所有後代文件中用「橙子」代替「蘋果」,除了,例如./fpd/font/symbol.php除某些文件外,遞歸地查找和替換

我的想法是使用find命令的-regex開關,但遺憾的是它沒有一個-v選擇像grep命令,因此我可以在正則表達式不能否定以文件必須在其中發生替換匹配。

回答

1

我在Git倉庫使用:

find . -path ./fpd/font/symbol.php -prune -o -exec sed -i 's/apple/orange/g' {} \; 
+0

這很好用!我稍微調整了它: 'default =「myApp」; grep -Rl $默認。 | grep -v「.git」| grep -v「angular.js」| grep -v $ 0 | xargs sed -i「s/$ default/somethingElse/g」;' 基本上,id所做的就是將angularjs-seed應用程序(「myApp」)的默認名稱替換爲整個內容(可以是用戶定義的)項目除.git文件夾外,文件angular.js(它在註釋塊中作爲示例出現)以及腳本本身。很好的答案! :) –

+0

順便說一句,根據您的示例在命令末尾添加{}會導致以下警告:'sed:can not read {}:沒有這樣的文件或目錄,所以我省略了它,它的工作方式類似於魅力! –

1

沒有測試過這一點,但它應該工作:

$ find . 
. 
./a 
./a/b.txt 
./b 
./b/a.txt 
$ find . -name \*a\* -print 
./a 
./b/a.txt 
$ find . ! -name \*a\* -print 
. 
./a/b.txt 
./b 
$ find . -not -name \*a\* -print 
. 
./a/b.txt 
./b 
1

你可以用!(或-not)與-name結合否定

grep -ilr orange . | grep -v ".git" | grep -e "\\.php$" | xargs sed -i s/orange/apple/g {} 

它會:

  1. 運行查找並僅替換實際上包含要替換單詞的文件;
  2. 不處理.git文件夾;
  3. 只處理.php文件。

不用說,您可以包含儘可能多的grep圖層,以過濾要傳遞到xargs的列表。

已知問題:

至少在我的Windows環境中它無法打開具有路徑或命名空間的文件。從來沒有想過這一個。如果有人想知道如何解決這個問題,我想知道。