Você pode usar uma variante do seu comando find
da seguinte forma:
find . -type f -exec grep -l word {} \;
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?
Você pode usar uma variante do seu comando find
da seguinte forma:
find . -type f -exec grep -l word {} \;
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
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.
Tags grep recursive hp-ux portability