如何在 ack 和 grep 中进行最大深度搜索?

Ame*_*ina 46 grep ack

有没有办法告诉ack只搜索当前文件夹上的文本?(或指定一个max-depth级别?)和grep

Dav*_*ins 46

您可以将 find 与 -exec 参数结合使用。例子:

find . -maxdepth 1 -exec grep foo {} \;
Run Code Online (Sandbox Code Playgroud)

这可以缩放,即 -maxdepth 2

  • 是的,抱歉,我同意我的编辑太具有侵入性。您可能仍想澄清 (`-maxdepth`) 不是可移植/标准语法(仅适用于 GNU 和某些 BSD)。此外,在这里使用 `\;` 没有意义(每个文件运行一个 `grep`)。使用 `grep -H foo {} +`(特定于 GNU)或 `grep foo /dev/null {} +`(标准)来确保始终打印文件名。与“-maxdepth 2”等效的标准是“find”。-path './*/*' -type d -prune -o -type f -exec ...` (6认同)
  • 我倾向于在这种方法中使用 `grep -Hin`,这样我就可以看到文件名和出现事件所在的行。 (5认同)
  • 另请注意,您的将给出目录的错误消息(包括`.`,因为您没有给出`-mindepth 1`),而GNU `grep` 不会尝试使用`-r` 读取目录(它_recurses_ 在它们上) . 你可能想在 `grep` 中添加一个 `-d skip`(假设是 GNU grep)或者更好地添加 `! -type d` 到 `find` 甚至更好的 `-type f`(或 `-xtype f` 假设 GNU `find`),因为您可能不希望 `grep` 读取非常规文件。 (3认同)

Eri*_*son 28

使用-nno-recurse

$ ack -n foo
Run Code Online (Sandbox Code Playgroud)

grep默认情况下不是递归的,-r只有在需要递归搜索时才应该使用该标志。

您可以使用以下命令搜索当前目录grep

$ grep -- foo *
Run Code Online (Sandbox Code Playgroud)

  • 不回答问题?(如果我想递归到 2 的深度怎么办) (24认同)