在 HP-UX 上的许多文件中搜索字符串

在 HP-UX 上的许多文件中搜索字符串

我需要仅使用 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确保始终打印文件名(另一个好处)。

一个显着的区别是文件列表不会排序。

相关内容