星号和句点在 find -name "*.mp3" 中有什么作用?

use*_*658 18 command-line find

在 中find -name "*.mp3",.mp3 之前有一个星号。不*匹配它之前的字符多次吗?但是星号前面什么都没有,那有什么作用*呢?还是因为该find命令不使用正则表达式?那么,..mp3 中的字符是正则表达式字符还是find只是将其解释为要匹配的句点?

Eli*_*gan 43

-name谓词需要水珠,而不是一个正则表达式。

在正则表达式中,*将匹配零个或多个前面的项目。但由于这是一个 glob,它匹配零个或多个任何字符。也就是说,*在 glob 中与.*在正则表达式中的含义相同。

在正则表达式中,.将完全匹配任何字符之一。但由于这是一个 glob,它没有被特殊对待,只是匹配一个文字.字符。也就是说,.在 glob中与正则表达式\.[.]在正则表达式中的含义相同。

如果您确实想匹配 glob 中任何字符的单个出现,您可以使用?. 在 glob 中,?.正则表达式中的含义相同。这与?正则表达式完全不同,正则表达式匹配零个或一个前一项(即,使前一项可选)。

这是唯一的语法主要是在这两个水珠和正则表达式同样是封闭的字符类[ ]。例如,[aeiou]匹配或者是任意字符aeio,或u。如果您编写了一个[ ]在大多数正则表达式方言中都可以使用的 -delimited 字符类,那么在 glob 中使用时,它也可能是一个具有相同含义的字符类。


除了作为find's-name-iname谓词的操作数之外,另一个广泛使用 glob 的地方是你的 shell。未加引号的通配元字符会被您的 shell 自动扩展为与它们匹配的文件名相对应的单独参数列表。

这就是为什么在将这种模式传递给find. 如果不这样做,您的外壳将尝试扩展它。如果您的外壳确实展开了它,find则不会看到模式本身,而是看到其展开的结果。这是不可取的,而且常常令人困惑。

请注意,您的 shell(可能是 bash,但在 Unix 风格的 shell 中通常如此)不会作为其默认行为扩展?*匹配文件名中的前导点。例如,除非您告诉它采取其他方式,否则您的 shell 会扩展?到当前目录中一个字符长的文件名,而不是.,即使.条目始终存在。它扩展*到当前目录中不以.. (在 bash 中,shopt -s dotglob会为您运行它的 shell 实例更改此设置,并shopt -u dotglob恢复默认行为。)只有前导点是特殊的,而不是其他点。

这与find's-name-iname谓词的行为不同,其中?*始终允许匹配前导.