2011-11-21 72 views
14

我在Bash是全新的,但我似乎無法找到一種方法讓它按照我想要的方式工作。BASH:遞歸程序替換文件樹中的文本

假設你有一個樹形目錄有2個文件: /top.php和/test/bottom.php

如何讓我的函數查找和替換說「你好」到「卓悅」在/頂.php AND在/test/bottom.php?

到目前爲止,我發現做到這一點的唯一方法是通過用不同深度級別調用同一個函數兩次:

find ./*.php -type f -exec sed -i 's/hello/bonjour/' {} \; 
find ./*/*.php -type f -exec sed -i 's/hello/bonjour/' {} \; 

肯定有一個遞歸的方式在一行做到這一點?

+0

可能[awk/sed的重複:如何做一個recursi找到/替換一個字符串?](http://stackoverflow.com/questions/1583219/awk-sed-how-to-do-a-recursive-find-replace-of-a-string) – Pureferret

回答

36

使用一個實際的模式來發現,而不是外殼通配符擴展:

find . -name '*.php' -type f -exec sed -i 's/hello/bonjour/' {} \; 
+0

你的工作完美!如果可以的話,我會加倍努力,但是我沒有所需的聲望 – Audioy

+1

@Erken:謝謝。您應該有信譽接受答案(投票數下面的複選標記)。無論如何,這是正確的迴應:-)。 – thiton

+0

完美,明白了!非常感謝你們,你們已經非常快! oO – Audioy

-2

使用xargs的和grep:

find . -type f | grep php$ | xargs -n1 -i sed -i 's/hello/bonjour/' {} 

下面是它如何工作的:

找到所有文件和 - 當前目錄:

find . -type f 

只包括那些在php結尾的文件:

grep php$ 

每次取線,並應用SED它:

xargs -n1 -i sed -i 's/hello/bonjour/' {} 
+2

,但它不起作用(考慮帶空格的文件名) – sehe

+0

首先,不要在您的文件名中放置空格! :)其次,只需引用 - 附上「{}」部分,你應該沒問題。 –

+3

沒有。 Grep/xargs會殺死你的小貓。 – sehe

2

關閉:

find -iname '*.php' -type f -exec sed -i 's/hello/bonjour/' {} \; 

或者

find -iname '*.php' -type f -print0 | 
    xargs -0 sed -i 's/hello/bonjour/' 
+0

你提供的第一個解決方案沒有奏效。我還沒有嘗試第二個,但thiton給出的解決方案更直接 – Audioy

+0

@Erken:那是因爲在頂層目錄中的文件比描述的問題多。學會引用你的通配符,如果你不希望它們擴大。 – sehe

+0

Gotcha!感謝sehe – Audioy