簡體   English   中英

除了某些文件之外,遞歸查找和替換

[英]Find & replace recursively except for certain files

關於這篇文章 ,我如何排除一個或多個文件應用字符串替換? 通過使用上述職位為例,我希望能夠在不同的 ,也就是說,一個給定目錄的所有后代文件“橘子”,以取代“蘋果” ./fpd/font/symbol.php

我的想法是在find命令中使用-regex開關,但不幸的是它沒有像grep命令那樣的-v選項,因此我無法否定正則表達式與必須進行替換的文件匹配。

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

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

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

$ 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

我在我的Git存儲庫中使用它:

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

它會:

  1. 僅在實際具有要替換的單詞的文件中運行查找和替換;
  2. 不處理.git文件夾;
  3. 僅處理.php文件。

毋庸置疑,您可以包含多個grep圖層,以便過濾傳遞給xargs的列表。

已知的問題:

至少在我的Windows環境中,它無法打開路徑或名稱中包含空格的文件。 從未想過那一個。 如果有人知道如何解決這個問題,我想知道。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM