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

3
我正在尝试递归地查找多种类型的文件,并替换找到的每个文件中的某个字符串。但是当我运行脚本时,它只能找到一种单一类型的文件。
我使用的命令行如下:
find . -name '*.tcl' -o -name '*.itcl' -o -name '*.db' -exec sed -i 's/abc/cba/g' {} +

每次我运行上面的命令,它只能找到类型为.db的文件。当我只用单个文件类型运行时,它可以正常工作。
3个回答

6

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

此外,从我的经验来看,最好只对匹配模式的文件运行sed -i,因此:

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

我该如何告诉它不要查找特定文件夹? - Jean-Luc Nacif Coelho
像这样:! -path '*/文件夹/*' - Gilles Quénot

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'

0

你可以做:

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

这种方式更加紧凑,而且你不用麻烦地操作OR和逻辑操作的分组。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接