Enl*_*ico 4 shell bash find pattern-matching
简而言之,我本能地写了一个这样的命令来查找这两个文件prefix.ext并prefix_suffix.ext沿着层次结构向下查找
find /some/path -type f -name 'prefix?(_suffix).zip'
Run Code Online (Sandbox Code Playgroud)
但它不起作用。
由于man find, under-name patter将模式称为“shell 模式”,因此我想知道是否可以控制应使用哪种模式,特别是是否extglob可以使用选项。
find仅使用 \xe2\x80\x9cbasic\xe2\x80\x9d shell 模式,如 POSIX 中所述。它不\xe2\x80\x99t 支持extglob-style globs (尽管 GNU 实现说它使用fnmatch,并且GNU C 库\xe2\x80\x99s 实现fnmatch支持扩展模式)。
如果您\xe2\x80\x99 使用 GNU find,则可以使用正则表达式进行过滤;有关详细信息,请参阅文档的相关部分:
-regex \'.*/prefix\\(_suffix\\)?\\.zip\'\nRun Code Online (Sandbox Code Playgroud)\n使用默认的正则表达式类型,或者
\n-regextype posix-extended -regex \'.*/prefix(_suffix)?\\.zip\'\nRun Code Online (Sandbox Code Playgroud)\n与 ERE。
\n正如其他人已经指出的那样,该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)
这样做的好处是便携且易于理解。
| 归档时间: |
|
| 查看次数: |
1832 次 |
| 最近记录: |