2012-05-09 70 views
2

我有一堆文件(具有相同的名稱,說abc.txt)遍佈整個網絡文件系統。Bash腳本根據文件名找到文件,並做搜索替換它們

我需要遞歸搜索這些文件中的每一個,一旦找到每一個文件,都要進行內容搜索並替換它們。

經過一番研究,我發現我可以使用find命令找到這些文件(用-r來遞歸吧?)。喜歡的東西:

find . -r -type f abc.txt 

而且用sed來已經找到並在每一個取代:

sed -ie 's/search/replace/g' abc.txt 

但我不知道如何粘上兩個在一起,使我找到ABC的所有地方。 txt,然後在每一個上進行搜索/替換。

我的目錄樹非常大,所以我知道通過所有目錄的遞歸搜索需要很長時間,但是這比手動嘗試查找每個文件要好。

我在使用Bash的OSX 10.6上。

謝謝大家!

更新:我認爲下面發佈的答案可能適用於其他操作系統(Linux也許),但對於OSX,我不得不稍微調整它。

find . -name abc.text -exec sed -i '' 's/search/replace/g' {} + 

在sed中指定我們不想生成備份文件後,似乎需要空引號。此手冊頁上寫着:

-i擴展:就地

編輯文件,保存與指定的擴展備份。如果給定零長度擴展,則不會保存備份。

回答

6
find . -r -type f abc.txt -exec sed -i -e 's/search/replace/g' {} + 
+3

只有缺少的是'-exec'子句末尾的'\;'或'+ ... ...並且複製了原始海報使用的'-ie'而不是'-i -e '可能會產生意想不到的效果,因爲前者將'e'指定爲用於備份的文件擴展名。 –

+0

已更新。感謝您的評論。 –

+0

謝謝amit_g!除了最終結局之外,所有這一切都很清楚。 {} +最後做了什麼? – nube