regex 使用正则表达式查找多个文件扩展名的命令

oxalkeyp  于 2023-06-07  发布在  其他
关注(0)|答案(1)|浏览(318)

我想知道在find命令中是否可以这样做。我试图找到所有与以下扩展名的具体文件,然后它将SED后。以下是我当前的命令脚本:

find . -regex '.*\.(sh|ini|conf|vhost|xml|php)$' | xargs sed -i -e 's/%%MEFIRST%%/mefirst/g'

不幸的是,我对正则表达式不是很熟悉,但我需要这样的东西。

qf9go6mv

qf9go6mv1#

我在评论中看到,你发现了如何通过非标准标志find -regex RE使用GNU基本正则表达式对其进行转义,但你也可以指定一种支持它的正则表达式类型,而不需要任何转义,使其更清晰:
GNU findutils(Linux)中,使用-regextype posix-extended

find . -regextype posix-extended -regex '.*\.(sh|ini|conf|vhost|xml|php)$' | …

在BSD find(FreeBSD find or Mac OS X find)中,使用-E

find . -E -regex '.*\.(sh|ini|conf|vhost|xml|php)$' | …

POSIX spec for find根本不支持正则表达式,但它支持通配符globbing和-o(表示“或”),所以你可以完全移植这个冗长的怪物:

find . -name '*.sh' -o -name '*.ini' -o -name '*.conf' \
  -o -name '*.vhost' -o -name '*.xml' -o -name '*.php' | …

确保这些globs被引用,否则shell将过早地扩展它们,您将得到语法错误(因为例如find -name a.sh b.sh …不会在两个匹配的文件 * 和 * 之间插入-o -name,它不会扩展到子目录中的文件)。
我还猜测您需要-iregex-iname而不是-regex-name,因此搜索不区分大小写。

相关问题