单独使用grep
足以完成任务:
grep -d skip -L '^- ' *
注意:与find
不同的是,这不会自动包含隐藏文件。
要进行递归搜索,请改用grep -L '^- ' -R .
(尽管-R
不符合POSIX标准,但它适用于GNU和BSD/macOS grep
)。
-L
,如Jamil Said的有用答案所述,打印每个输入文件(指定的)路径,该路径未包含搜索项。
-d skip
跳过目录(虽然-d
选项不符合POSIX标准,但它受到GNU和BSD/macOS grep
的支持)。
注意:正如hek2mgl在评论中指出的那样,*
的文件名扩展结果可能会太长,导致出现错误,例如/usr/bin/grep: Argument list too long
。
(相比之下,如果使用-R .
使grep
进行递归搜索,则不会遇到此问题。)
最大长度是平台特定的,可以使用getconf ARG_MAX
查询,但请注意,实际限制取决于您的环境的大小,比这低 - 请参见此文章。
实际上,在5000个文件左右通常不会有问题,即使在具有相对较低的最大长度的平台(如macOS)上 - 除非您的文件名异常长和/或您的通配模式具有漫长的路径组件[1]
。
最近的Linux版本具有更高的限制。
如果遇到限制并且必须解决它,请使用xargs
,如下所示:
printf '%s\0' * | xargs -0 grep -d skip -L '^- '
请注意,使用
-0
读取以NUL结尾的输入虽然不符合POSIX标准,但是GNU和BSD/macOS的
xargs
都支持它。
如果输入的文件名确实不能适应单个命令行,
xargs
将对输入进行分区,以便产生最少的
grep
调用来处理所有文件名。
[1] macOS 10.12的限制为
262,144
字节(256 KB);如果我们保守地假设,在扣除环境的大小和命令行的固定部分后,我们得到
250,000
字节的文件名列表,这给了我们每个文件名+空格(列表分隔符)允许长达
49
字节。相比之下,Ubuntu 16.04的限制高出8倍:
2,097,152
字节(2 MB)。