Enlico Asked: 2022-01-22 05:55:38 +0800 CST2022-01-22 05:55:38 +0800 CST 2022-01-22 05:55:38 +0800 CST 有没有办法让 find 使用 shell 的 extglob shell 选项? 772 简而言之,我本能地写了一个这样的命令来查找这两个文件prefix.ext并向prefix_suffix.ext下层级 find /some/path -type f -name 'prefix?(_suffix).zip' 但它不起作用。 因为man find, under-name patter将模式称为“shell 模式”,所以我在徘徊是否可以控制应该使用哪种模式,特别是是否extglob可以使用选项。 bash shell 3 个回答 Voted Best Answer Stephen Kitt 2022-01-22T06:07:48+08:002022-01-22T06:07:48+08:00 find仅使用“基本”外壳模式,如 POSIX 中所述。它不支持extglob-style glob(尽管 GNU 实现说它使用fnmatch,并且GNU C 库的实现fnmatch支持扩展模式)。 如果您使用的是 GNU find,则可以使用正则表达式进行过滤;有关详细信息,请参阅文档的相关部分: -regex '.*/prefix\(_suffix\)?\.zip' 使用默认的正则表达式类型,或 -regextype posix-extended -regex '.*/prefix(_suffix)?\.zip' 与 ERE。 they 2022-01-22T06:33:48+08:002022-01-22T06:33:48+08:00 正如其他人已经指出的那样,该find实用程序默认情况下不支持在bashshell 和其他(最初继承自kshshell)中发现的扩展通配模式。 您可以使用bashshell 来执行这些测试: find /some/path -type f \ -exec bash -O extglob -c '[[ ${1##*/} == prefix?(_suffix).zip ]]' bash {} \; \ -print 但是,这非常低效,因为您需要为bash要调查的每个文件生成一个进程。使用一种或几种正常模式重写扩展的通配模式会更有意义: find /some/path -type f \ \( -name prefix.zip -o -name prefix_suffix.zip \) \ -print 这具有便携性和易于理解的优点。 Enlico 2022-01-22T06:06:32+08:002022-01-22T06:06:32+08:00 另一个答案提到了正则表达式,这让我想到了一个明显的解决方案:使用-regex而不是-name: find /some/path -type f -regex '.*/prefix\(_suffix\)?\.zip' 我怀疑它可能会更慢,但可能不会那么慢。
find
仅使用“基本”外壳模式,如 POSIX 中所述。它不支持extglob
-style glob(尽管 GNU 实现说它使用fnmatch
,并且GNU C 库的实现fnmatch
支持扩展模式)。如果您使用的是 GNU
find
,则可以使用正则表达式进行过滤;有关详细信息,请参阅文档的相关部分:使用默认的正则表达式类型,或
与 ERE。
正如其他人已经指出的那样,该
find
实用程序默认情况下不支持在bash
shell 和其他(最初继承自ksh
shell)中发现的扩展通配模式。您可以使用
bash
shell 来执行这些测试:但是,这非常低效,因为您需要为
bash
要调查的每个文件生成一个进程。使用一种或几种正常模式重写扩展的通配模式会更有意义:这具有便携性和易于理解的优点。
另一个答案提到了正则表达式,这让我想到了一个明显的解决方案:使用
-regex
而不是-name
:我怀疑它可能会更慢,但可能不会那么慢。