【问题标题】:What's the difference between grep "str" . and grep "str" *grep "str" 和有什么区别。和 grep "str" *
【发布时间】:2023-06-27 14:25:01
【问题描述】:

grep "str" *
这是否意味着 grep 执行 grep 的所有内容?
那么grep -r "str" . 的结果比前者多呢

【问题讨论】:

  • 您可以通过自己阅读grep 手册和信息页面获得更快的答案,例如通过输入man grepinfo grep 甚至grep --help;谷歌搜索linux grep 也提供了很多相关的答案。

标签: linux command-line grep


【解决方案1】:

当您运行grep str * 时,shell 将扩展* 以匹配当前目录中的所有文件名,除非它们以点开头,然后将该文件列表传递给grep 命令。

当你运行grep -r str . 时,shell 没有任何东西可以扩展自己。然而,grep 命令对-r 选项的反应是遍历其参数列表并递归地降到所有目录。

所以,至少有三个区别:

  • grep -r 会找到隐藏文件
  • grep -r 将通过子目录
  • grep -r 也适用于包含大量文件的目录。在这种情况下,您可能会收到一条错误消息,指出命令行对于 grep str * 来说太长了。

【讨论】:

    【解决方案2】:
    grep
    

    会搜索一个模式,最后一个参数是要搜索的文件,所以:

    grep str *
    

    将在当前目录(与 * 作为通配符匹配)中搜索模式“str”中的所有文件。

    grep -r str .
    

    将从当前目录开始递归搜索模式str(因此在目录等内部)(单点是当前目录,两个点是前一个目录)。

    【讨论】:

      【解决方案3】:
      grep  "str" * # search a string str in all files in current directly but not sub directories 
      grep -r "str" . # search a string str recursively in cireent directory and in all sub directories in all file whose file name has a single character
      

      【讨论】:

        【解决方案4】:

        bash 总是扩展 * ? [...] .. 如果你没有设置 noglob

        当你使用“.”时, grep 将从当前目录搜索,但是当您使用其中之一时 上面的符号,bash 扩展你的命令,然后调用 grep

        【讨论】: