我想知道为什么使用该命令搜索文件时会得到以下输出:
$ 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):grep
grep
stderr
stderr
/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 选项。请注意,这不适用于名称中带有空格的文件...仍在开发该版本。