我有一个目录~/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.*'