我如何查找和替換每次出現的狀況: git
subdomainA.example.com
與 dom
subdomainB.example.com
在/home/www/
目錄樹下的每一個文本文件中遞歸? spa
cd /home/www && find . -type f -print0 | xargs -0 perl -i.bak -pe 's/subdomainA\.example\.com/subdomainB.example.com/g'
find /home/www \( -type d -name .git -prune \) -o -type f -print0 | xargs -0 sed -i 's/subdomainA\.example\.com/subdomainB.example.com/g'
-print0
告訴find
打印以空字符而不是換行符分隔的每一個結果。 若是您的目錄中的文件名中帶有換行符,這種狀況極有可能發生,這仍然使xargs
能夠使用正確的文件名。 命令行
\\( -type d -name .git .prune \\)
是一個表達式,它徹底跳過名爲.git
全部目錄。 若是使用SVN或要保留其餘文件夾,則能夠輕鬆擴展它-只需與更多名稱匹配便可。 它大體等效於-not -path .git
,但效率更高,由於它沒有檢查目錄中的每一個文件,而是徹底跳過了它。 因爲-prune
實際工做方式,所以必須-prune
-o
。 code
有關更多信息,請參見man find
。 遞歸
find /home/www/ -type f -exec perl -i.bak -pe 's/subdomainA\.example\.com/subdomainB.example.com/g' {} +
find /home/www/ -type f
將列出/ home / www /(及其子目錄)中的全部文件。 「 -exec」標誌告訴find在找到的每一個文件上運行如下命令。 索引
perl -i.bak -pe 's/subdomainA\.example\.com/subdomainB.example.com/g' {} +
是在文件上運行的命令(一次運行)。 {}
被替換爲文件名。 命令末尾的+
指示find
爲多個文件名構建一個命令。 it
按照find
手冊頁:「命令行的構建與xargs生成命令行的方式幾乎相同。」 效率
所以,無需使用xargs -0
或-print0
便可實現您的目標(並處理包含空格的文件名)。 擴展
注意 :請勿在包含git repo的文件夾上運行此命令-更改.git可能會損壞git索引。
find /home/www/ -type f -exec \ sed -i 's/subdomainA\.example\.com/subdomainB.example.com/g' {} +
與這裏的其餘答案相比,它比大多數答案更簡單,而且使用sed代替了perl,這是原始問題的要求。
一種更簡單的方法是在命令行上使用如下內容
find /home/www/ -type f|xargs perl -pi -e 's/subdomainA\.example\.com/subdomainB.example.com/g'