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'
, 的-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)