我正在尝试使用该find
命令,并偶然发现了一篇文章http://www.linux.ie/newusers/beginners-linux-guide/find.php其中指出:
通配符用斜杠转义,因此 BASH 将文字星号作为参数发送给 find 实用程序,而不是执行文件名扩展并将任意数量的文件作为参数传递。
用于命令find . -name up\*
。
作为 Linux 新手,我不太明白如何*
解释用于转义元字符的反斜杠,并返回结果,就像将其传递给一样find
。这是否意味着如果我使用-name
选项,我必须使用反斜杠来传递通配符,如果我不使用,-name
我不必使用反斜杠?此外,使用反斜杠是否是为了让 bash shell 不会尝试扩展它?
答案1
请注意,您使用术语“正则表达式”相当宽泛。您在选项中处理的内容find
-name
在行为上与... 非常接近shell
glob
。另一方面,该find
-regex
选项使用正则表达式搜索。您可以通过 -regextyp 选项选择要使用的正则表达式样式。当前实现的类型选择为:emacs(这是默认类型)、posix-awk、posix-basic、posix-egrep 和 posix-extended。...
如何处理反斜杠和星号等取决于你想要做什么。如果你想find -name
将星号视为通配符,那么你需要确保它是不是find
当实际从命令行读取模式 时转义。
为了保证 寻找以未转义的形式获取它,你必须防止壳(通常狂欢)对你的星号执行它的*(非常强大的)shell扩展...保护你必须 逃避它在命令行级别(即在 shell 眼中“退出”)。此时的关键概念是“保护”...
你可以通过三种方式保护你的 asterisk 免受 shell 攻击:
- 使用
'
单引号'
- 使用
"
双引号"
- 使用
\
反斜杠(和不引号)
因此,为了find
将星号视为通配符,以下任何一种“保护”方法都可以起作用。
find -name up'*'
find -name up"*"
find -name up\*
find -name 'up*'
find -name "up*"
find -name "up"\*
请注意,shell 将绝不'
对单引号中的任何内容执行扩展'
..."
双引号则"
是另一回事。
答案2
这里您缺少的是 shell 和 find 都扩展了 *。您希望 find 扩展它,因此您需要将其从 shell 中隐藏起来。
您要查找当前目录中所有名称以“on”开头的文件,对吗?如果让 shell 扩展 *,您将无法找到它。假设您当前的目录包含文件“upwards”和“uplift”。然后 shell 将您的命令更改为
find . -name upward uplift
这是 find 的错误语法。如果没有匹配的文件,那么 shell 就不会处理该参数 — 但养成使用正确命令的习惯是很好的,无论这些细节如何。