我想搜索基本名称匹配正则表达式的文件。我试过这个:
$ find '/my/path' -regextype posix-extended -regex 'reg1' -regex 'reg2'
我的问题是正则表达式针对完整路径进行了测试。我只想测试文件的基本名称。
GNU find 不包括任何仅适用于基本名称的正则表达式运算符。这是不幸的。我们最接近的方法是修改正则表达式以从正则表达式的前面去除斜杠分隔的部分:
find /my/path -regextype posix-extended -regex ".*/reg1"
这适用于普通的 linux 路径名,但对于具有不寻常字符(例如换行符)的路径名可能会失败。
正如 geekosaur 指出的那样,您的输入正则表达式不应匹配多个组件。如果您对正则表达式没有任何控制权(例如,如果它作为变量 $REG1 传递),您可以尝试修改它以转换.
为[^/]
:
find /my/path -regextype posix-extended -regex ".*/${REG1/./[^/]}"
这对于很多正则表达式都会失败(例如,'.*.txt' 会被严重损坏)。但是,如果您知道正则表达式会很简单,那么它可能会起作用。
对于较慢但有效的解决方案,您可以在-exec
块内进行所有模式匹配:
find /my/path -exec bash -c 'basename "$0" | egrep -q '"'$REG1'"' && echo "$0"' '{}' ';'
这里的逻辑是find
枚举所有文件并将它们分配给$0
子shell。子shell 使用basename
andegrep
将输出过滤到与输入正则表达式匹配的路径。请注意 egrep 查找本地匹配项;如果要匹配完整的基本名称,请使用egrep -q '"'^$REG1\$'"'
根据输入正则表达式的语义(例如,如果$REG1
要匹配基本名称的任何子字符串),您可以先在整个路径中搜索正则表达式,然后仅过滤到基本名称,从而获得更好的性能:
find /my/path -regextype posix-extended -regex ".*${REG1}.*" \
-exec bash -c 'basename "$0" | egrep -q '"'$REG1'"' && echo "$0"' '{}' ';'
You would need to anchor the regex, with something like
find /my/path -regextype posix-extended -regex 'mumble$'
where mumble
must be written in a way that excludes /
characters (for example, you could not use .*
, you would need to say [^/]*
).