如何在目录中非递归地对所有文件使用grep?

Joh*_*Red 51 grep

我想在目录中的所有文件中搜索一串文本(而不是它的子目录;我知道该-r选项会这样做,但这不是我想要的)。

  1. 跑步

    grep "string" /path/to/dir
    
    Run Code Online (Sandbox Code Playgroud)

    应该能够做到这一点,我读过,但它给了我错误:

    grep: dir: 是一个目录

  2. 接下来,我尝试grep在多个文件上运行。

    grep "string" .bashrc .bash_aliases 完美地工作。

    grep "string" .bash* 也按预期工作。

    grep "string" * 给我的错误:

    grep: data: Is a directory
    grep: Desktop: Is a directory
    grep: Documents: Is a directory
    grep: Downloads: Is a directory
    ...
    
    Run Code Online (Sandbox Code Playgroud)

只打印错误,我没有得到匹配的行。我尝试使用该-s选项,但无济于事。

所以,我的问题:

  1. 为什么我不能grep像 (1) 那样在目录上使用,而我应该可以使用?我已经在互联网上的大量示例中看到了这一点。
    编辑:当我说“在目录上使用 grep”时,我的意思是“搜索该目录中不包括其子目录的所有文件”。我相信这就是 grep 将目录传递给它而不是文件时所做的。我不正确吗?

  2. 请给我一个关于grep解释(2)中命令行为的工作原理的解释。
    编辑:让我更具体。为什么使用通配符来指定要搜索的多个文件,.bash*而不是使用*,甚至不使用./*

  3. 如何使用 搜索目录(而不是其子目录)中的所有文件grep

wja*_*rea 54

在 Bash 中,glob 不会扩展为隐藏文件,因此如果要搜索目录中的所有文件,则需要指定 hidden files.*和 non-hidden *

为避免“是目录”错误,您可以使用-d skip,但在我的系统上我也收到错误grep: .gvfs: Permission denied,因此我建议使用-s,它会隐藏所有错误消息。

所以你要找的命令是:

grep -s "string" * .*
Run Code Online (Sandbox Code Playgroud)

如果您在另一个目录中搜索文件:

grep -s "string" /path/to/dir/{*,.*}
Run Code Online (Sandbox Code Playgroud)

另一种选择是使用dotglobshell 选项,这将使 glob 包含隐藏文件。

shopt -s dotglob
grep -s "string" *
Run Code Online (Sandbox Code Playgroud)

对于另一个目录中的文件:

grep -s "string" /path/to/dir/*
Run Code Online (Sandbox Code Playgroud)

† 有人提到我不应该得到这个错误。他们可能是对的 - 我读了一些书,但我自己无法理解。

  • @Hashim 比较在您的主目录中运行的 `echo * .*` 和 `echo *.*` 的输出,差异应该很明显。否则LMK我会解释的。 (2认同)

ano*_*us2 12

您需要-d skip添加该选项。

  1. Grep 正在搜索文件内部。如果您想搜索目录内的文件,您可以递归搜索,正如您所说。

  2. 默认情况下,grep 将读取所有文件,并检测目录。因为默认情况下您还没有用-d选项定义如何处理目录,所以它会给出错误输出。

  3. 在父目录中搜索将是 grep -d skip "string" ./*


小智 7

老前辈可能会这样做:

find . -type f -print0 | xargs -0 grep "string"
Run Code Online (Sandbox Code Playgroud)

  • 您还需要`-maxdepth 1`。 (5认同)
  • 为什么不`find . -type f -exec grep string {} +`? (3认同)