所以我想grep -ril
在一个文件夹中做。我希望它只返回匹配的顶部文件夹。
为了显示:
/tmp/: grep -ril "hello"
返回:
tmp1/banan/file
tmp1/banan2/file
tmp2/ape/file
tmp2/ape2/file
预期结果:
tmp1
tmp2
答案1
如果只想打印第一级目录,找到该目录下的第一个匹配项后立即退出会更高效。您可以使用它来实现此目的-q
,它返回匹配成功,否则失败,并且与-r
它结合时,在找到匹配项时立即退出。
for d in */; do grep -qri "hello" -- "$d" && printf "%s\n" "$d"; done
--
用于指示选项的结尾,因此后面的内容都是文件参数,这可以保护任何指定的目录-something
并可以解释为选项。
如果您希望上面的for
内容匹配以 开头的目录.
,请考虑设置shopt -s dotglob
,另请参阅这。
如果需要/
从输出中删除尾随,可以使用 bash 参数扩展并使用"$d"
print代替"${d%/}"
。
答案2
目录与内容模式不匹配;文件可以。您似乎要问的是如何获取与模式匹配的文件的目录。
去掉第一个组件之后的路径,并确保结果按照您指定的顺序以唯一值的形式呈现
grep -ril "hello" | sed 's!/.*$!!' | sort -u
如果您不想更改结果的顺序,请将 替换sort
为awk '!h[$0]++'