为什么使用 -name 和 -regex 都找不到我的目录

ale*_*lex 10 find pattern-matching

我有一个目录~/Documents/machine_learning_coursera/

命令

find . -type d -name '^machine'
Run Code Online (Sandbox Code Playgroud)

没有找到任何东西

我也试过

find . -type d -regextype posix-extended -regex '^machine'
Run Code Online (Sandbox Code Playgroud)

以便匹配字符串的开头而没有。

我也试过-name

find . -type d -regextype posix-extended -regex -name '^machine'
Run Code Online (Sandbox Code Playgroud)

并得到错误:

find: paths must precede expression: `^machine'
Run Code Online (Sandbox Code Playgroud)

我在这里做错了什么?

Sté*_*las 21

find's-name采用 shell/glob/fnmatch()通配符模式,而不是正则表达式。

GNUfind-regex非标准扩展名确实采用正则表达式(默认情况下为旧式 emacs 类型),但这适用于完整路径(如标准-path也采用通配符),而不仅仅是文件名(并隐式锚定)

因此,要查找名称以 开头的目录类型的文件machine,您需要:

find . -name 'machine*' -type d
Run Code Online (Sandbox Code Playgroud)

或者:

find . -regextype posix-extended -regex '.*/machine[^/]*' -type d
Run Code Online (Sandbox Code Playgroud)

(对于那个特定的正则表达式,你不需要,-regextype posix-extended因为默认的正则表达式引擎也可以工作)

请注意,第一个与文件匹配的文件也需要是区域设置中的有效文本,而对于第二个,完整路径需要是有效文本。


roa*_*ima 11

for 的参数-name很像 shell glob,所以它隐式绑定到它匹配的文件名的开头和结尾,你需要*指出可能还有更多:

find . -type d -name 'machine*'
Run Code Online (Sandbox Code Playgroud)

对于您的替代方案,-regex记录(参见man find)为“整个路径上的匹配,而不是搜索”,也隐式绑定到匹配的开始和结束,因此您需要

find . -type d -regextype posix-extended -regex '(.*/)?machine[^/]*'
Run Code Online (Sandbox Code Playgroud)

当您说您“也尝试过-name”时,您忘记了-regex需要一个参数,因此将其用作-name该参数,然后意外地窒息'^machine'


ter*_*don 6

, 的-name测试find不需要正则表达式,它需要文件 globs。在^有水珠没有特殊的意义,所以你的命令是寻找实际命名的目录^machine。你想要这个,它将找到名称以以下开头的所有目录machine

find . -type d -name 'machine*'
Run Code Online (Sandbox Code Playgroud)

您的其他尝试失败,因为-regex就像-name。它不是要启用的标志,您需要将正则表达式作为输入传递给它。在这里你什么也没给,所以find抱怨。另请注意,-regex测试将尝试匹配整个路径,而不仅仅是名称。使用-regex测试做你想做的事情的正确方法是:

find . -maxdepth 1 -type d -regex '.*/machine.*' 
Run Code Online (Sandbox Code Playgroud)