单独使用grep 就足够了:
grep -d skip -L '^- ' *
注意:与find 不同,这不会自动包含隐藏 文件。
要递归搜索,请改用grep -L '^- ' -R .(尽管-R 不符合POSIX,但它适用于GNU 和BSD/macOS grep)。
-L,如Jamil Said's helpful answer 中所述,打印不 包含搜索词的每个输入文件的路径(按指定)。
-d skip 跳过目录(虽然选项 -d 不符合 POSIX 标准,但 GNU 和 BSD/macOS grep 都支持它)。
警告:正如hek2mgl 在评论中指出的那样,* 文件名扩展后产生的命令行可能太长了 strong>,导致出现/usr/bin/grep: Argument list too long等错误。
(相比之下,如果你用-R .递归搜索grep,你就不会遇到这个问题。)
最大值。长度是特定于平台的,可以通过getconf ARG_MAX查询,但请注意实际限制低于,具体取决于您的环境大小 - 请参阅this article。
实际上,5000 个文件可能不会成为问题,即使在最大值相对较低的平台上也是如此。长度,例如 macOS - 除非您的文件名特别长和/或您的 globbing 模式具有冗长的路径组件[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 字节,这给了我们每个文件名 + 空格(列表分隔符)的 250000 / 5000 == 50 字节,这样每个文件名的长度就可以达到49 字节。
相比之下,Ubuntu 16.04 的限制是 8 倍:2,097,152 字节 (2 MB)。