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

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

所以我想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

如果您不想更改结果的顺序,请将 替换sortawk '!h[$0]++'

相关内容