模式在匹配中出现在哪里?

Tim*_*Tim 5 find

的手册页find说:

-姓名

文件名的基础(删除前导目录的路径)

$ find ~ -name bookmark | less
Run Code Online (Sandbox Code Playgroud)

什么都不返回,而

$ find ~ -name bookmarks | less
./.streamtuner/cache/bookmarks
./.config/zathura/bookmarks
./.elinks/bookmarks
Run Code Online (Sandbox Code Playgroud)

有三场比赛。

为什么第一个没有第二个的匹配?

如果我想找到那些名称包含bookmark在文件名中的位置bookmark的文件,我应该如何使用find?谢谢。

Mic*_*mer 8

给出的模式-name必须匹配整个基本文件名-name模式的行为定义为:

如果当前路径名的基名与模式匹配,则主要应评估为真

这意味着当整个基本名称与您提供的模式匹配时,这是真的。您可以将模式视为基本上类似于 shell glob:您可以在其中使用*?[...]模式,模式的开头和结尾与字符串的开头和结尾对齐。

所以你的命令:

find ~ -name bookmarks
Run Code Online (Sandbox Code Playgroud)

查找名为“bookmarks”的文件,因为这是整个文件名,但是:

find ~ -name bookmark
Run Code Online (Sandbox Code Playgroud)

只会找到名为“书签”的文件,因为模式中没有通配符。

要匹配名为bookmark和 的文件bookmarks,您可以使用:

find ~ -name 'bookmark*'
Run Code Online (Sandbox Code Playgroud)

所以如果你想找到

那些名称包含书签的文件,无论书签在文件名中的位置如何

您可以使用:

find ~ -name '*bookmark*'
Run Code Online (Sandbox Code Playgroud)

匹配名称包含任意数量字符的文件,然后是bookmark,然后是任意数量的字符。

  • +1。我只想补充一点,模式周围的单引号是强制性的,否则外壳本身会尝试扩展它们,因此有时(当它匹配当前目录中的某些内容时)将其更改为其他内容。(如果你真的只想要文件,在`~`后添加`-type f`) (4认同)