2011-07-20 44 views
146

我運行這個命令來查找和替換所有文件中的「橙色」「蘋果」的所有出現在我的網站的根目錄取代:查找和sed的目錄和子目錄

find ./ -exec sed -i 's/apple/orange/g' {} \; 

,但它不不經過子目錄。

這個命令有什麼問題?

編輯:這裏是找到./命令的輸出的一些行:

./index.php 
./header.php 
./fpd 
./fpd/font 
./fpd/font/desktop.ini 
./fpd/font/courier.php 
./fpd/font/symbol.php 
+0

你可以運行'找到/'和發佈一些示例輸出?和目錄strucuture請。編輯:謝謝! – Jacob

+0

嗯你的發現是正確的,適用於我的subdirs。 – Jacob

+1

你怎麼知道它不處理子目錄? – carlpett

回答

258

你發現看起來應該避免發送目錄名的sed:

find ./ -type f -exec sed -i -e 's/apple/orange/g' {} \; 
+10

您可能需要將'sed -i's/apple/orange/g''更改爲'sed -i''s/apple/orange/g''才能使其工作。 – paulmelnikow

+4

'-i'接受一個參數:用於保存臨時文件的擴展名。在GNU sed中,看起來像'-i'和它的參數之間沒有空格,但是在BSD sed中有......所以BSD'-i''s/foo/bar /''相當於GNU'-i' /富/酒吧/'。 – paulmelnikow

+13

實際上在Mac OS上添加'-e'不起作用。 'touch a b c d e'後面跟着上面的命令產生一個如下所示的目錄:'a a-b b-e c-e d-e e-e'。 – paulmelnikow

5

這爲我工作:

find ./ -type f -exec sed -i '' 's#NEEDLE#REPLACEMENT#' *.php {} \; 
1

我認爲,我們可以用一個簡單的一行命令來完成這一

for i in `grep -rl eth0 . 2> /dev/null`; do sed -i ‘s/eth0/eth1/’ $i; done 

請參閱此page

+1

http:// mywiki.wooledge.org/DontReadLinesWithFor – tripleee

47

對於較大的s & r任務使用grep和xargs會更好更快,因此,例如;

grep -rl 'apples' /dir_to_search_under | xargs sed -i 's/apples/oranges/g' 
+9

感謝您的回答,這是非常有益的!如果在git倉庫中,使用'git grep -l'apples'|甚至更快xargs sed -i's/apples/oranges/g'' – mrodrigues

-3

在linuxOS:

sed -i 's/textSerch/textReplace/g' namefile 

如果 「sed的」 不行試試:

perl -i -pe 's/textSerch/textReplace/g' namefile 
+2

他想要查找包含該字符串的子目錄中的所有文件並替換,而不僅僅是一個文件 –

0
grep -e apple your_site_root/**/*.* -s -l | xargs sed -i "" "s|apple|orage|"