为什么 find 既不能使用 -name 也不能使用 -regex 找到我的目录

为什么 find 既不能使用 -name 也不能使用 -regex 找到我的目录

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

命令

find . -type d -name '^machine'

没有找到任何东西

我也尝试过

find . -type d -regextype posix-extended -regex '^machine'

以便匹配字符串的开头而不匹配任何内容。

我也尝试过-name

find . -type d -regextype posix-extended -regex -name '^machine'

并得到错误:

find: paths must precede expression: `^machine'

我在这里做错了什么?

答案1

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

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

所以要查找类型的文件目录其名字以 开头machine,您需要:

find . -name 'machine*' -type d

或者:

find . -regextype posix-extended -regex '.*/machine[^/]*' -type d

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

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

答案2

的参数-name很像 shell glob,因此它隐式绑定到它匹配的文件名的开头和结尾,并且您需要*指示可能还会有更多内容:

find . -type d -name 'machine*'

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

find . -type d -regextype posix-extended -regex '(.*/)?machine[^/]*'

当你说你“也尝试过-name”,你忘记了-regex需要一个参数,所以它用作-name该参数,然后被意外噎住了'^machine'

答案3

-name,的测试不find采用正则表达式,而是采用文件 glob。在 glob 中没有^特殊含义,因此您的命令正在查找实际名为 的目录^machine。您想要这个,它将找到名称以 开头的所有目录machine

find . -type d -name 'machine*'

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

find . -maxdepth 1 -type d -regex '.*/machine.*' 

相关内容