gnu find:仅在basename上应用-regex

时间:2012-04-24 05:51:37

标签: regex linux find command

我想搜索基本名称匹配正则表达式的文件。我试过这个:

$ find  '/my/path' -regextype posix-extended -regex 'reg1' -regex 'reg2'

我的问题是正则表达式是针对完整路径进行测试的。我只想测试文件的基本名称。

2 个答案:

答案 0 :(得分:0)

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枚举所有文件,并将它们分配给子Shell中的$0。子Shell使用basenameegrep将输出向下过滤到与输入正则表达式匹配的路径。注意egrep查找本地匹配项;如果要匹配完整的基本名称,请使用egrep -q '"'^$REG1\$'"'

取决于输入正则表达式的语义(例如,如果$REG1旨在匹配基名的任何子字符串),则可以通过首先在整个路径中搜索正则表达式然后过滤为正则表达式来获得更好的性能。只是基本名称:

find /my/path -regextype posix-extended -regex ".*${REG1}.*" \
    -exec bash -c 'basename "$0" | egrep -q '"'$REG1'"' && echo "$0"' '{}' ';'

答案 1 :(得分:-1)

您需要使用

之类的东西来锚定正则表达式
find /my/path -regextype posix-extended -regex 'mumble$'

其中mumble必须以排除/个字符的方式撰写(例如,您无法使用.*,您需要说[^/]*)。< / p>