Eu estou tentando pesquisar um monte de arquivos XML para determinadas seqüências de caracteres, mas não outras seqüências de caracteres e estou tendo problemas para colocar um comando juntos para fazê-lo. Só quero listar os nomes dos arquivos que correspondem aos critérios de inclusão / exclusão. Eu estive tentando:
find . -name *.xml -exec grep -li "string1\|string2" {} \; | xargs grep -Li "string3\|string4"
Mas estou tendo problemas porque os nomes de arquivos retornados de encontrar tem espaços em seus nomes e o segundo grep divide todos em pequenos pedaços e, claro, não encontra tais arquivos. Eu tentei adicionar -0
ao xargs , e remove os erros, mas diz "Nome do arquivo longo demais" e só executa o primeiro grep.
Como faço para ajustar esse comando para que ele funcione corretamente em arquivos com espaços nos nomes?
find . -name "*.xml" -exec grep -liZ "string1\|string2" {} \; | xargs -0 grep -Li "string3\|string4"
(OZ
bandeira paragrep
produz terminadores zero em sua lista de resultados, que deve ser compatível comxargs -0
)Respostas:
Há mais de uma maneira de fazer isso. Isso deve manter o número total de processos executados no mínimo:
obrigado Matt Gibson por nos lembrar da
-Z
flag para o GNU grep.fonte
*.xml
de alguma forma, para evitar a expansão do shell.Você pode fazer tudo em um
find
que evita todos os problemas com espaços em nomes de arquivos. Algo comoO "-q" suprime toda a saída do grep. o
-exec
primary retorna true quando o processo sai com status 0, como o grep faz quando encontra uma correspondência, e o-not
primária inverte isso. Então, colocamos diretamente duas condições nofind
e, como resultado, imprimimos apenas os nomes de arquivos que satisfazem ambos - não é necessário tubo!fonte
Como mencionado no meu comentário, acho que tudo o que você está perdendo é a bandeira -Z no primeiro
grep
para ir junto com o -0 que você estava tentando em seuxargs
:fonte
Se o fator limitante for CPU (ou seja, seu disco é rápido) e você tiver mais núcleos de CPU, você pode usar o GNU Parallel:
Ao executar os dois
grep
s imediatamente após cada outra chance, os arquivos ainda estão no cache de disco. Se o disco procura são lentos, você pode adicionar-j1
para desabilitar o paralelismo.Assista ao vídeo de introdução para saber mais: http://www.youtube.com/watch?v=OpaiGYxkSuQ
fonte