BASH:用于替换文件树中的文本的递归程序

时间:2011-11-21 20:06:27

标签: bash recursion replace

我是Bash的全新人,但我似乎无法找到办法让它做我想做的事。

想象一下,你有一个包含2个文件的树目录: /top.php和/test/bottom.php

如何让我的函数看起来并在/top.bp和/test/bottom.php中将“hello”替换为“bonjour”?

到目前为止,我发现这样做的唯一方法是使用不同的深度级别调用相同的函数两次:

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

当然,有一种递归的方法可以在一行中完成这项工作吗?

3 个答案:

答案 0 :(得分:37)

使用实际模式进行查找而不是shell通配符扩展:

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

答案 1 :(得分: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/'

答案 2 :(得分:-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/' {}