Procura de string em muitos arquivos no HP-UX

4

Eu preciso encontrar quais arquivos (eles podem ter espaço no nome do arquivo) de um diretório contém uma string usando apenas sh e os comandos do sistema (Perl não é uma opção ).

Para alguns arquivos, este comando funciona bem:

# grep -l word *
file 1
file1

Mas se eu tiver 270k, obtenho o seguinte erro:

#  grep -l word *
sh: /usr/bin/grep: The parameter list is too long.

No HP-UX, o comando xargs não tem a opção -0 , então não posso usar isso:

# find . -print0 |xargs -0 grep -l
xargs: unknown option: -0

Você sabe qual comando eu posso usar?

    
por Giovanni 18.11.2011 / 16:36

3 respostas

5

Você pode usar uma variante do seu comando find da seguinte forma:

find . -type f -exec grep -l word {} \; 
    
por 18.11.2011 / 17:15
4

Se a sua versão do HP-UX for recente o suficiente, você poderá chamar find com a ação -exec … + . Essa ação faz o mesmo trabalho que xargs (chame um comando em vários arquivos correspondentes de uma vez, sem sobrecarregar o limite de comprimento da linha de comando), mas de maneira confiável para qualquer nome de arquivo.

find . -type f -exec grep -l word {} +

Se a sua versão do HP-UX for muito antiga, talvez você tenha apenas -exec … \; e não -exec … + . A versão ; chama o comando em um arquivo de cada vez, o que é um pouco mais lento.

find . -type f -exec grep -l word {} \;

Se os nomes dos seus arquivos não contiverem \"' ou espaço em branco, você poderá usar xargs sem a opção -0 .

find . -type f -print | xargs grep -l word
    
por 19.11.2011 / 02:19
0

Para um equivalente POSIX próximo de grep -l word ./* , que divide a lista de arquivos como a necessidade de evitar o limite execve() no tamanho dos argumentos, você poderia fazer:

find -L . ! -name . -prune ! -name '.*' -type f -exec \
  grep -l word /dev/null {} +
  • ! -name . -prune é não recorrer aos subdiretórios
  • -L em combinação com -type f é pesquisar somente em arquivos regulares (após a resolução do symlink) (um bônus comparado à abordagem grep ... ./* que pareceria dentro de qualquer tipo de arquivo)
  • ! -name '.*' para excluir arquivos ocultos, pois ./* faz
  • /dev/null para garantir que o nome do arquivo seja sempre impresso (outro bônus).

Uma diferença notável é que a lista de arquivos não será classificada.

    
por 31.08.2017 / 17:43