find 中的“regex”和“name”指令

find 中的“regex”和“name”指令

-name命令选项需要什么样的正则表达式语法find?我的印象是它与 for 相同,-regex但情况似乎并非如此。

$ mkdir test && cd test
$ touch .sw.
$ touch .swp
$ touch .abc.swo
$ touch notswap.py
$ find . -name "*sw." -type f
./.sw.
$ find . -name "*sw*" -type f
./notswap.py
./.sw.
./.swp
./.abc.swo
$ find . -regex ".*sw." -type f
./.sw.
./.swp
./.abc.swo

FWIW,我知道它-regex匹配整个路径并且-name仅匹配文件名的基础。我希望大家清楚这不是这里的问题。作为一个更具体的问题,如何使用该选项匹配以.swxwhere xcan be any character结尾的所有文件-name

元信息:

$ find --version
find (GNU findutils) 4.5.11
...
$ echo $0
bash

答案1

-name pattern
              Base of file name (the path with the leading directories
              removed) matches shell pattern pattern.  Because the leading
              directories are removed, the file names considered for a match
              with -name will never include a slash, so `-name a/b' will
              never match anything (you probably need to use -path instead).
              A warning is issued if you try to do this, unless the
              environment variable POSIXLY_CORRECT is set.  The
              metacharacters (`*', `?', and `[]') match a `.' at the start
              of the base name (this is a change in findutils-4.2.2; see
              section STANDARDS CONFORMANCE below).  To ignore a directory
              and the files under it, use -prune; see an example in the
              description of -path.  Braces are not recognised as being
              special, despite the fact that some shells including Bash
              imbue braces with a special meaning in shell patterns.  The
              filename matching is performed with the use of the fnmatch(3)
              library function.  Don't forget to enclose the pattern in
              quotes in order to protect it from expansion by the shell.

它使用 shell 模式而不是正则表达式。

来源:find(1)


来自 GNU 手册下姓名:

以下是搜索名称与特定模式匹配的文件的方法。有关这些测试的模式参数的描述,请参阅 Shell 模式匹配。

2.1.4 Shell模式匹配

find 和locate 可以将文件名或文件名的一部分与shell 模式进行比较。 shell 模式是一个可能包含以下特殊字符的字符串,这些特殊字符称为通配符或元字符。

您必须引用包含元字符的模式,以防止 shell 自行扩展它们。双引号和单引号都可以;用反斜杠转义也是如此。

  • *
    匹配任何零个或多个字符。
  • ?
    匹配任意一个字符。
  • [string]
    精确匹配字符串 string 中的一个字符。这称为字符类。作为简写,字符串可以包含范围,该范围由两个字符组成,两个字符之间有破折号。例如,类“[a-z0-9_]”匹配小写字母、数字或下划线。您可以通过放置“!”来否定一个类或紧跟在左括号之后的“^”。因此,“[^AZ@]”匹配除大写字母或 at 符号之外的任何字符。
  • \
    删除其后面的字符的特殊含义。这甚至在字符类中也有效。
    在执行 shell 模式匹配(“-name”、“-wholename”等)的查找测试中,模式中的通配符将匹配“.”。在文件名的开头。对于locate来说也是如此。因此,“find -name '*macs”将匹配名为 .emacs 的文件,“locate '*macs”也将匹配。

斜杠字符在查找和定位的 shell 模式匹配中没有特殊意义,这与通配符不匹配的 shell 不同。因此,模式 'foobar' 可以匹配文件名 'foo3/bar' 和模式 './srsc' 可以匹配文件名 './src/misc'。

如果您想使用“locate”命令定位某些文件,但不需要查看完整列表,您可以使用“--limit”选项仅查看少量结果,或使用“--count”选项仅显示匹配的总数。


回答你的问题:

find . -name "*.sw?" -type f

相关内容