我需要仅使用 sh 和系统命令(Perl 是不是一个选项)。
对于一些文件,此命令可以正常工作:
# grep -l word *
file 1
file1
但如果我有 270k 文件,则会出现以下错误:
# grep -l word *
sh: /usr/bin/grep: The parameter list is too long.
在 HP-UX 中,该xargs
命令没有该-0
选项,因此我无法使用它:
# find . -print0 |xargs -0 grep -l
xargs: unknown option: -0
你知道我可以使用哪个命令吗?
答案1
您可以使用命令的变体,find
如下所示:
find . -type f -exec grep -l word {} \;
答案2
如果您的 HP-UX 版本足够新,您可以find
使用该-exec … +
操作进行调用。此操作与xargs
(一次对多个匹配文件调用命令,而不溢出命令行长度限制)执行相同的工作,但对任何文件名都以可靠的方式。
find . -type f -exec grep -l word {} +
如果您的 HP-UX 版本太旧,您可能只有-exec … \;
且没有-exec … +
.该;
版本一次对一个文件调用该命令,速度有点慢。
find . -type f -exec grep -l word {} \;
如果您的文件名不包含\"'
空格,那么您可以xargs
不使用该-0
选项。
find . -type f -print | xargs grep -l word
答案3
grep -l word ./*
对于相当于根据需要分割文件列表以避免execve()
参数大小限制的close POSIX ,您可以这样做:
find -L . ! -name . -prune ! -name '.*' -type f -exec \
grep -l word /dev/null {} +
! -name . -prune
是不递归到子目录-L
结合使用是仅在常规文件中搜索(在符号链接解析之后)(与在任何类型的文件中查找的方法-type f
相比,这是一个好处)grep ... ./*
! -name '.*'
排除隐藏./*
文件/dev/null
确保始终打印文件名(另一个好处)。
一个显着的区别是文件列表不会排序。