在find -name "*.mp3"
.mp3 之前有一个星号。不*
匹配它之前的字符多次吗?但是星号前面没有任何东西,那么它是做什么的*
呢?还是因为find
命令没有使用正则表达式?那么,.
.mp3 中的是正则表达式字符还是find
只是将其解释为要匹配的句点?
在find -name "*.mp3"
.mp3 之前有一个星号。不*
匹配它之前的字符多次吗?但是星号前面没有任何东西,那么它是做什么的*
呢?还是因为find
命令没有使用正则表达式?那么,.
.mp3 中的是正则表达式字符还是find
只是将其解释为要匹配的句点?
-name
谓词采用glob ,而不是正则表达式。在正则表达式中,
*
将匹配零个或多个前面的项目。但由于这是一个 glob,它匹配零个或多个任何字符。也就是说,在 glob 中的含义与在正则表达式中*
的含义相同。.*
在正则表达式中,
.
将完全匹配任何字符之一。但由于这是一个 glob,它没有被特殊对待,只是匹配一个文字.
字符。也就是说,在 glob 中的含义与或在正则表达式中.
的含义相同。\.
[.]
如果您确实想匹配 glob 中任何字符的单次出现,您可以使用
?
. 在 glob 中,与正则表达式中的?
含义相同。.
这与正则表达式完全不同,?
正则表达式匹配零个或一个前面的项目(即,使前面的项目可选)。在 glob 和正则表达式中几乎相同的唯一语法是包含在
[
]
. 例如,[aeiou]
匹配任何字符a
,e
,i
,o
, 或u
. 如果您编写了一个[
]
在大多数正则表达式方言中都有效的 - 分隔字符类,那么在 glob 中使用时它也可能是具有相同含义的字符类。除了作为
find
's-name
和-iname
谓词的操作数之外,另一个广泛使用 glob 的地方是你的 shell。不带引号的通配元字符由您的 shell 自动扩展为与它们匹配的文件名相对应的单独参数列表。这就是为什么在将这种模式传递给
find
. 如果你不这样做,你的 shell 将尝试扩展它。如果您的外壳确实扩展了它,find
则不会看到模式本身,而是看到其扩展的结果。这是不可取的,而且经常令人困惑。请注意,您的 shell(可能是 bash,但通常适用于 Unix 样式的 shell)作为其默认行为,不会扩展
?
或*
匹配文件名中的前导点。例如,除非您告诉它以其他方式运行,否则您的 shell 会扩展?
为当前目录中的一个字符长的文件名,而不是.
,即使.
条目始终存在。它扩展*
到当前目录中不以 . 开头的文件名.
。(在 bash 中,shopt -s dotglob
将为您运行它的 shell 实例更改此设置,并shopt -u dotglob
恢复默认行为。)只有前导点是特殊的,而不是其他点。这与
find
's-name
和-iname
谓词的行为不同,其中?
和*
总是允许匹配前导.
。星号(通常称为“通配符运算符”)表示
find
应该返回所有带有.mp3
扩展名的文件。因为您使用双引号,所以
bash
尝试扩展"*.mp3"
glob。*.mp3
如果当前目录中有一些文件,它们的名称将替换glob。为了演示,
echo
在行首放一个,例如echo find ...
。如果使用单引号 (
'
),则不执行全局扩展。使用“
'*.mp3'
”代替“"*.mp3"
”。