我想知道这在 find 命令中是否可行。我试图找到所有具有以下扩展名的特定文件,然后它将被 SED。这是我当前的命令脚本:
find . -regex '.*\.(sh|ini|conf|vhost|xml|php)$' | xargs sed -i -e 's/%%MEFIRST%%/mefirst/g'
不幸的是,我对正则表达式不太熟悉,但我需要这样的东西。
最佳答案
我在评论中看到您发现了如何通过非标准标志 find -regex RE
使用 GNU 基本正则表达式来转义它,但您也可以指定一种支持它而没有任何转义的正则表达式,使其更加清晰:
在 GNU findutils (Linux),使用 -regextype posix-extended
:
find . -regextype posix-extended -regex '.*\.(sh|ini|conf|vhost|xml|php)$' | …
在 BSD 中查找( FreeBSD find 或 Mac OS X find ),使用 -E
:find . -E -regex '.*\.(sh|ini|conf|vhost|xml|php)$' | …
POSIX spec for find根本不支持正则表达式,但它支持通配符通配符和 -or
,所以你可以完全移植这个冗长的怪物:find . -name '*.sh' -or -name '*.ini' -or -name '*.conf' \
-or -name '*.vhost' -or -name '*.xml' -or -name '*.php' | …
确保这些 glob 被引用,否则 shell 会过早地扩展它们并且你会得到语法错误(因为例如 find -name a.sh b.sh …
不会在两个匹配的文件之间插入 -or -name
并且它不会扩展到子目录中的文件)。
关于regex - 使用正则表达式查找多个文件扩展名的命令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22624905/