我正在使用 grep 搜索一个大目录,我遇到的问题是我只需要满足正则表达式的目录。我不需要文件名。
我正在使用的 grep 命令是。
grep -Erin "RegEx" * > outputfile.txt
答案1
根据@RalfFriedl所说,如果您只想要与正则表达式匹配的文件所在的目录名称,则可以使用 dirname。如果该目录中有多个文件,您可以使用 sort 将输出折叠到排序的唯一列表。像下面这样:
dirname $(grep -Eril "RegEx" *) | sort -u
答案2
Grep 没有这个选项。
如果您不需要文件名,为什么要使用-n
行号选项?
有一个选项可以列出匹配的文件名:
-l, --files-with-matches
禁止正常输出;相反,打印通常会打印输出的每个输入文件的名称。扫描将在第一个匹配处停止。
您可以使用sed
删除文件名的最后部分,只保留目录部分。如果您只想列出每个目录一次,则可以通过 运行输出sort -u
。
答案3
考虑使用该find
命令。
find . -type d -regextype posix-extended -regex 'RegEx'
在当前目录中查找目录类型的内容,使用 posix-extended 匹配路径名(与 grep -E 相同)。
答案4
# usage: dgrep regex dir
dgrep(){
find "$2" -type d -print0 | xargs -0 sh -c '
rex=$1; shift
for d; do grep -sq "$rex" "$d"/* "$d"/.[!.]* && echo "$d"; done
' sh "$1"
}
grep -rl
与+解决方案不同sed
,这只会扫描目录中的文件,直到找到第一个匹配项 - 根据您的数据,这可能会大大加快速度。
-sq
请随意在;之后添加 grep 选项在命令行上传递它们的脚本是可能的,但这会使一切变得复杂而没有什么好处。