在 Linux 中使用 find 解释正则表达式

在 Linux 中使用 find 解释正则表达式

我正在尝试使用该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 就不会处理该参数 — 但养成使用正确命令的习惯是很好的,无论这些细节如何。

相关内容