我正在尝试递归查找多种类型的文件,并在找到的每个文件中替换某个字符串。但是当我运行脚本时,它只找到一种类型的文件。
我正在使用的命令行是这样的
find . -name '*.tcl' -o -name '*.itcl' -o -name '*.db' -exec sed -i 's/abc/cba/g' {} +
每次我运行上面的命令时,它只会找到类型为.db
. 当我使用单一文件类型运行它时,它工作正常。
您需要像这样对-names *
部分进行分组()
:
此外,最好(根据我的经验)sed -i
只在与模式匹配的文件上运行,所以:
find . \( -name '*.tcl' -o -name '*.itcl' -o -name '*.db' \) -exec sed -i '/abc/s/abc/cba/g' {} +
下面的命令将搜索 txt 或日志文件,并将源字符串替换为目标字符串。
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'
你可以做:
find . -regex ".*\.\(tcl\|itcl\|db\)" -exec sed -i 's/abc/cba/g' {} +
这更紧凑,您不必弄乱 OR 和对逻辑操作进行分组。