所以我想在文件夹中做grep -ril。我希望它只返回顶部的文件夹,得到一个匹配。
为了说明:
/tmp/: grep -ril "hello"
返回:
tmp1/banan/file
tmp1/banan2/file
tmp2/ape/file
tmp2/ape2/file预期结果:
tmp1
tmp2发布于 2020-12-02 12:28:00
目录与内容的模式不匹配;文件匹配。您似乎要问的是如何获取与模式匹配的文件目录。
去掉通过第一个组件的路径,并确保结果按排序顺序显示为唯一值,如您所指定的那样。
grep -ril "hello" | sed 's!/.*$!!' | sort -u如果不想更改结果的顺序,则将sort替换为awk '!h[$0]++'
发布于 2020-12-02 12:59:01
如果您只想打印第一级目录,则在此目录下找到第一个匹配目录后立即退出将更有效。您可以使用-q来实现这一点,它返回匹配成功,否则失败,如果与-r组合,则在找到匹配时立即退出。
for d in */; do grep -qri "hello" -- "$d" && printf "%s\n" "$d"; done--用于指示选项的结尾,所以接下来的都是文件参数,这保护了任何名为-something的目录,并且可以解释为选项。
如果您希望上面的for匹配以.开头的目录,请考虑设置shopt -s dotglob,请参见这。
如果需要从输出中移除尾随的/,可以使用bash参数展开,而不是"$d",打印"${d%/}"。
https://unix.stackexchange.com/questions/622534
复制相似问题