有没有办法让 find 使用 shell 的 extglob shell 选项?

Enl*_*ico 4 shell bash find pattern-matching

简而言之,我本能地写了一个这样的命令来查找这两个文件prefix.extprefix_suffix.ext沿着层次结构向下查找

find /some/path -type f -name 'prefix?(_suffix).zip'
Run Code Online (Sandbox Code Playgroud)

但它不起作用。

由于man find, under-name patter将模式称为“shell 模式”,因此我想知道是否可以控制应使用哪种模式,特别是是否extglob可以使用选项。

Ste*_*itt 8

find仅使用 \xe2\x80\x9cbasic\xe2\x80\x9d shell 模式,如 POSIX 中所述。它不\xe2\x80\x99t 支持extglob-style globs (尽管 GNU 实现说它使用fnmatch,并且GNU C 库\xe2\x80\x99s 实现fnmatch支持扩展模式)。

\n

如果您\xe2\x80\x99 使用 GNU find,则可以使用正则表达式进行过滤;有关详细信息,请参阅文档的相关部分

\n
-regex \'.*/prefix\\(_suffix\\)?\\.zip\'\n
Run Code Online (Sandbox Code Playgroud)\n

使用默认的正则表达式类型,或者

\n
-regextype posix-extended -regex \'.*/prefix(_suffix)?\\.zip\'\n
Run Code Online (Sandbox Code Playgroud)\n

与 ERE。

\n


Kus*_*nda 7

正如其他人已经指出的那样,该find实用程序默认不支持 shellbash和其他(最初从kshshell 继承)中发现的扩展通配模式。

不过,您可以使用shellbash来执行这些测试:

find /some/path -type f \
    -exec bash -O extglob -c '[[ ${1##*/} == prefix?(_suffix).zip ]]' bash {} \; \
    -print
Run Code Online (Sandbox Code Playgroud)

但这是非常低效的,因为您需要bash为您想要调查的每个文件生成一个进程。使用一种或多种正常模式重写扩展通配模式会更有意义:

find /some/path -type f \
    \( -name prefix.zip -o -name prefix_suffix.zip \) \
    -print
Run Code Online (Sandbox Code Playgroud)

这样做的好处是便携且易于理解。