gpt4 book ai didi

regex - gnu 找到 : apply -regex on basename only

转载 作者:太空狗 更新时间:2023-10-29 11:23:28 24 4
gpt4 key购买 nike

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

$ 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 block 内完成所有模式匹配:

find /my/path -exec bash -c 'basename "$0" | egrep -q '"'$REG1'"' && echo "$0"' '{}' ';'

这里的逻辑是 find 枚举所有文件并将它们分配给子 shell 中的 $0。子 shell 使用 basenameegrep 将输出过滤为与输入正则表达式匹配的路径。请注意,egrep 查找本地匹配项;如果要匹配完整的基本名称,请使用 egrep -q '"'^$REG1\$'"'

根据输入正则表达式的语义(例如,如果 $REG1 旨在匹配 basename 的任何子字符串),您可以获得更好的性能,以便首先在整个路径中搜索正则表达式然后过滤到基本名称:

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

关于regex - gnu 找到 : apply -regex on basename only,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10292398/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com