对多种文件类型使用`find`并替换找到的文件中的字符串

时间:2012-10-15 19:44:46

标签: bash recursion sed find

我正在尝试以递归方式查找多种类型的文件,并在找到的每个文件中替换某个字符串。但是当我运行脚本时,它只能找到一种类型的文件。

我正在使用的命令行是

find . -name '*.tcl' -o -name '*.itcl' -o -name '*.db' -exec sed -i 's/abc/cba/g' {} +

每次运行上面的命令时,它只会找到.db类型的文件。当我使用单一文件类型运行它时,它可以正常工作。

3 个答案:

答案 0 :(得分:6)

您需要将-names *部分与()分组,如下所示:

此外,根据我的经验,仅在与模式匹配的文件上运行sed -i会更好:

find . \( -name '*.tcl' -o -name '*.itcl' -o -name '*.db' \) -exec sed -i '/abc/s/abc/cba/g' {} +

答案 1 :(得分:1)

下面的命令将搜索txt或log文件,并用目标字符串替换源字符串。

 find . -name "*.txt" -o -name "*.log"|xargs perl -pe 's/source/target/g'

你可以通过在perl语句中添加-i来进行替换,如下所示:

find . -name "*.txt" -o -name "*.log"|xargs perl -pi -e 's/source/target/g'

答案 2 :(得分:0)

你可以这样做:

find . -regex ".*\.\(tcl\|itcl\|db\)" -exec sed -i 's/abc/cba/g' {} +

这更紧凑,您不必乱用OR并对逻辑操作进行分组。