grep -ril,只显示顶级目录一次

Jes*_*erg 2 grep

所以我想grep -ril在一个文件夹中做。我希望它只返回匹配的顶级文件夹。

为了显示:

/tmp/: grep -ril "hello"

返回:

tmp1/banan/file
tmp1/banan2/file
tmp2/ape/file
tmp2/ape2/file
Run Code Online (Sandbox Code Playgroud)

预期结果:

tmp1
tmp2
Run Code Online (Sandbox Code Playgroud)

tha*_*isp 6

如果只想打印一级目录,在该目录下找到第一个匹配后立即退出会更有效率。您可以使用-qwhich 返回成功匹配否则失败并在-r找到匹配时立即退出来实现这一点。

for d in */; do grep -qri "hello" -- "$d" && printf "%s\n" "$d"; done
Run Code Online (Sandbox Code Playgroud)

--用于指示选项的结尾,因此无论后面是文件参数,这都保护了任何命名的目录,-something并且可以将其解释为选项。

如果您希望以上内容for匹配以 开头的目录,请.考虑设置shopt -s dotglob,另请参阅此内容

如果您需要/从输出中删除尾随,您可以使用 bash 参数扩展,而不是使用"$d"print "${d%/}"


roa*_*ima 5

目录与内容模式不匹配;文件做。您似乎要问的是如何获取与模式匹配的文件目录。

剥离经过第一个组件的路径,并确保结果按您指定的排序顺序显示为唯一值

grep -ril "hello" | sed 's!/.*$!!' | sort -u
Run Code Online (Sandbox Code Playgroud)

更换sortawk '!h[$0]++',如果你不希望更改结果的顺序