grep 的问题

grep 的问题

我想知道为什么使用该命令搜索文件时会得到以下输出:

$ grep -l prac *
allprac
grep: Desktop: Is a directory
grep: Documents: Is a directory
grep: Downloads: Is a directory
grep: Music: Is a directory
grep: Pictures: Is a directory

我想知道为什么除了显而易见的内容之外,它还显示了其他所有内容allprac?列出的几个目录是空的。

答案1

强制扫描当前文件夹中的所有文件而不是 grepping 标准输入,但由于驱动器不会进入子文件夹*,因此它只会向m 报告文件夹出现的情况并禁用报告,只需重定向到(POSIX):grepgrepstderrstderr/dev/null

$ grep -l prac * 2>/dev/null

然后避免报告文件夹的另一种方法是(非 POSIX):

$ grep -l Build --exclude-dir=* *

扫描包括子文件夹(POSIX):

$ grep -l prac * -r

到 grep 标准输入(POSIX):

$ cat file | grep -l prac

的实现有很多,grep因此在键集和默认行为方面可能彼此不同,但有一个标准 POSIX 描述了要由grep(和其他软件) 实现的最小键集。然而,我不知道 POSIX 是否为 定义了默认搜索行为grep。似乎该实现与 Linux 的unix实现几乎一样。grep -l Build --exclude-dir=* *

答案2

@Cremefraiche 的回答是正确的,这是由于通配符造成的。但是,他的解决方案似乎不起作用。由于 '*' shell 通配符匹配所有文件和文件夹(点文件除外),因此bash最终将当前目录中所有文件和文件夹的名称作为参数发送到grep。由于无法“读入”目录(类似于无法读取cat目录),因此应该排除目录。最好的方法是使用该工具find

grep -l prac $(find . -maxdepth 1 -type f)

这将搜索目录中的所有常规文件 (-type f)。如果您想以相同的方式进行递归搜索,只需删除 -maxdepth 选项。请注意,这不适用于名称中带有空格的文件...仍在开发该版本。

相关内容