AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / unix / 问题 / 790061
Accepted
notaorb
notaorb
Asked: 2025-01-24 17:16:51 +0800 CST2025-01-24 17:16:51 +0800 CST 2025-01-24 17:16:51 +0800 CST

Unix 'find' 实用程序:关于与数学中的 Kleene Star 的关系的问题

  • 772

有人知道最左列中的 Unixfind搜索 -name 查询与Wikipedia_?上定义的 Kleene Star 有何关系吗?如何使用完成行?_?find

      . : empty string,  X : cartesian product
      -name \A\B                 Language A X B
      -name \ABC                 Language A X B X C 

      -name : name at leafs, builds set of string in language

      -name \.         V^0 {e, ""} language only of the empty string   A with only one leg?
      -name \?         V^1  V      language of single characters
      -name \???...    V^n         language of n character strings, concatenates strings in language
      -name \*         V^*         langauge of \cup_{i\gte0} V^i     
 a?   -name \n         V^n         like \{n\} in grep with integer?
 b?   -name \*n        (V^*)^n     language of n words, word can be empty
      -name \*\??...   (V^*)^n        
      -name \?\*       V^+         langauge of \cup_{i\gte1} V^i
      -name \?\*\??... (V^+)^n     language of n words, word must have character

看起来是只有一条腿且长度定义的 .图。使用,但是我似乎找不到与 等效的。Agrep\{n\}a?find

find
  • 1 1 个回答
  • 49 Views

1 个回答

  • Voted
  1. Best Answer
    Stéphane Chazelas
    2025-01-24T19:34:57+08:002025-01-24T19:34:57+08:00

    find传递给-name和-path(在某些实现中也是-iname和)的模式与用于文件名生成(又名路径名扩展,又名shell 中的通配符)的模式相同,并且源自第一个 Unix shell 在 70 年代早期调用的执行该过程的辅助程序。-ipathfind/etc/glob

    现在通常的find实现使用80 年代后期引入的标准fnmatch()函数glob()以及 ,wordexp()以便能够将这种 shell 扩展运算符带入除 shell 之外的软件中。

    在标准 shell 全局变量中,?匹配任何单个字符,相当于 regexp .,并且*匹配任何字符序列,相当于 regexp.*并且[set]匹配给定集合中的任何单个字符或排序元素,与 regex 相同,[set]只是集合否定是用!而不是^,就是这样。

    因此,虽然 regexp*对应于 Kleen 星号,但fnmatch()'s*不对应。它是将 Kleen 星号应用于?(单个字符)。

    Ksh88 引入了许多扩展的通配符,使它们与正则表达式之间具有奇偶校验:

    • @(...)相当于扩展正则表达式(...)
    • ?(...)相当于扩展正则表达式(...)?
    • *(...)相当于扩展的正则表达式(...)*,所以相当于Kleen星号。
    • +(...)相当于扩展的正则表达式(...)+。
    • !(...)没有标准的 ERE 等效项。
    • 并|在其中用于交替。

    ksh93 又添加了一些:

    • {x,y}(...)相当于 ERE (...){x,y}。
    • &在 for 中使用且没有标准 ERE 等效项。
    • ~(flags:...)包括~(E:...)真正将 ERE 视为现实。

    zsh 还添加了与 ERE 具有奇偶校验的运算符,其语法不同(通常比 ksh 更简洁),例如:

    • #相当于ERE *(克莱恩星)
    • ##相当于 ERE+
    • (...)相当于 ERE (...)(与|ERE 类似,在内部进行交替处理)
    • (#cy,y)相当于 ERE {x,y}。
    • 以及其他一些它自己的作品。

    但是这些 ksh 或 zsh 操作符都没有达到该sh语言的标准规范(尽管标准sh语言主要基于 ksh88 语言的一个子集),也没有达到(如's /fnmatch()所使用的)。find-name-path

    但是,的 GNU 和 uClibc 实现fnmatch()确实支持一个标志,通过该标志可以识别FNM_EXTMATCHksh88 扩展的通配符(包括),但据我所知,没有实现使用该标志进行/匹配。这样做会使它们不符合 POSIX 标准,因为匹配名称以 结尾的文件(而不是名称由任意数量的s 组成的文件)是必需的。*(...)find-name-path-name '*(foo)'(foo)foo

    但是,有些find实现有一个-regex运算符,其工作原理类似于-path,只不过它采用隐式锚定正则表达式而不是 shell 全局变量。find不过,默认正则表达式风格和在正则表达式风格之间切换的语法因实现而异(例如,-E在 BSD 中,您需要一个选项find来切换到标准扩展正则表达式,而-regextype posix-extended在 GNU 中则需要一个谓词find)。

    对于名称由任意数量的foos 组成的文件,您可以执行以下操作:

    find -E . -regex '.*/(foo)*' # BSD
    find . -regextype posix-extended -regex '.*/(foo)*' # BSD
    

    这些*s 对应于克莱恩星。

    如果你问如何_在-name( fnmatch()) 模式中匹配 0 次或 1 次出现,答案是“你不能”。

    没有与 等效的find -E . -regex '.*/foo_?bar'(BSD 语法)等效的-name,但您始终可以执行以下操作:

     find . '(' -name foobar -o -name foo_bar ')'
    

    或者使用zsh的递归通配符:

     print -rC1 -- **/foo(_|)bar(ND)
    

    或者在 ksh93 中(它可以globstar识别 zsh 的**/递归 glob 运算符):

    function println {
      (( $# == 0 )) || printf '%s\n' "$@"
    }
    set -o globstar
    FIGNORE=.:..
    println ~(N)**/foo?(_)bar
    

    或者bash5.0+ (可以extglob识别 ksh88 操作符,并且可以进行globstar zsh递归**/通配):

    println() {
      (( $# == 0 )) || printf '%s\n' "$@"
    }
    shopt -s dotglob nullglob globstar extglob
    shopt -u failglob
    println **/foo?(_)bar
    

    或者使用perl具有高级正则表达式和File::Find模块:

    perl -MFile::Find -lse '
      find(sub {print $File::Find::name if $_ =~ $re}, @ARGV)
      ' -re='^foo_?bar\z' -- .
    

    还有一个File::FnMatchperl 模块,FNM_EXTMATCH如果系统fnmatch()有的话您可以使用它:

    perl -MFile::Find -MFile::FnMatch=:fnmatch -lse '
      find(sub {print $File::Find::name if
        fnmatch($pat, $_, FNM_EXTMATCH)}, @ARGV)
      ' -- -pat='foo?(_)bar' -- .
    
    • 0

相关问题

  • 如果未引用 -name 后面的模式,则 find 的奇怪行为

  • 将变量从子shell打印到父shell [重复]

  • 检查某个文件夹是否存在于某个目录中

  • 从命令行查找和替换 CSS 文件中的颜色

  • GNU find:在-exec中获取绝对和相对路径

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    模块 i915 可能缺少固件 /lib/firmware/i915/*

    • 3 个回答
  • Marko Smith

    无法获取 jessie backports 存储库

    • 4 个回答
  • Marko Smith

    如何将 GPG 私钥和公钥导出到文件

    • 4 个回答
  • Marko Smith

    我们如何运行存储在变量中的命令?

    • 5 个回答
  • Marko Smith

    如何配置 systemd-resolved 和 systemd-networkd 以使用本地 DNS 服务器来解析本地域和远程 DNS 服务器来解析远程域?

    • 3 个回答
  • Marko Smith

    dist-upgrade 后 Kali Linux 中的 apt-get update 错误 [重复]

    • 2 个回答
  • Marko Smith

    如何从 systemctl 服务日志中查看最新的 x 行

    • 5 个回答
  • Marko Smith

    Nano - 跳转到文件末尾

    • 8 个回答
  • Marko Smith

    grub 错误:你需要先加载内核

    • 4 个回答
  • Marko Smith

    如何下载软件包而不是使用 apt-get 命令安装它?

    • 7 个回答
  • Martin Hope
    user12345 无法获取 jessie backports 存储库 2019-03-27 04:39:28 +0800 CST
  • Martin Hope
    Carl 为什么大多数 systemd 示例都包含 WantedBy=multi-user.target? 2019-03-15 11:49:25 +0800 CST
  • Martin Hope
    rocky 如何将 GPG 私钥和公钥导出到文件 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Evan Carroll systemctl 状态显示:“状态:降级” 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim 我们如何运行存储在变量中的命令? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S 为什么 /dev/null 是一个文件?为什么它的功能不作为一个简单的程序来实现? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 如何从 systemctl 服务日志中查看最新的 x 行 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - 跳转到文件末尾 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla 为什么真假这么大? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis 在一个巨大的(70GB)、一行、文本文件中替换字符串 2017-12-30 06:58:33 +0800 CST

热门标签

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve