Quero encontrar arquivos que contenham duas cadeias juntos, por exemplo, o arquivo contém ambos string1
e string2
.
Eu quero o caminho completo dos arquivos na saída. Não quero ver avisos de "permissão negada".
grep -l string2 `grep -l string1 /path/*`
que é o mesmo que
grep -l string2 $(grep -l string1 /path/*)
Edit: aqui está porque grep string1 /path/* | grep string2
não faz o que eu acho que alwbtc.
$ cd /tmp
$ cat a
apples
oranges
bananas
$ cat b
apples
mangoes
lemons
$ cat c
mangoes
limes
pears
$ cd ~
$ grep apples /tmp/* | grep mangoes
$
Nada foi encontrado, mas o arquivo b contém as duas strings.
Aqui está o que eu acho que o alwbtc quer
$ grep -l apples $(grep -l mangoes /tmp/*)
/tmp/b
-l
opção de retornar os nomes dos arquivos em vez das linhas. Ele está usando o cifrão ou as aspas para passar essa lista comoFILE
argumento para o segundo grep. Isso permite que o segundo grep pesquise a totalidade de cada arquivo encontrado, em vez das linhas individuais, como na minha solução.-l
opção para os dois comandos serem considerados iguais.Coloque um
grep
no outro:grep "string1" /path/to/files/* | grep "string2"
fonte
Aqui está o comando ack equivalente à resposta do RedGrittyBrick :
Funciona da mesma maneira (exceto,
ack
por padrão, pesquisa o diretório atual recursivamente). O conteúdo nas$()
pesquisas,string1
mas-l
gera apenas os nomes de arquivos em que essa sequência foi encontrada. Eles são passados como argumentos para o comando externo, o que significa questring2
é pesquisado apenas dentro dessa lista de arquivos.fonte
ou menos redundante:
Isso funcionará se as strings estiverem em linhas diferentes do mesmo arquivo e também evitará falsos positivos se um nome de arquivo contiver uma das strings.
fonte
Para elaborar a solução do @ RedGrittyBrick, que apresenta uma falha ao executar o comando autônomo, além de suprimir a saída de erro conforme o esperado e encontrar arquivos recursivamente, você pode considerar
grep -l 'STRING1' $(! grep -lrs 'STRING2' /absolute/path/to/search/dir && echo /dev/null)
-s
A opção suprimirá as mensagens de erro. A-r
opção permite procurar seqüências de caracteres em diretórios aninhados arbitrariamente,!
combinadas com&& echo /dev/null
garantias de que o comando não será desligado. Caso contrário, seinner grep
não encontrar nenhum arquivo, ele não produzirá nada, de modo queouter grep
aguardará indefinidamente a entrada para pesquisar. Esta solução saídas/dev/null
nestes casos assimouter grep
vai procurarSTRING1
em/dev/null
onde é suposto para não encontrar nada.fonte
Eu estava procurando por uma maneira extensível de executar 2 ou mais strings e surgiu com isso:
O primeiro grep encontra recursivamente os nomes dos arquivos que contêm
string1
dentropath-to-files
.Os resultados são canalizados para os
xargs
quais executa um ou mais comandos grep nesses arquivosstring2
.Os resultados são então canalizados para outro
xargs
comandostring3
- é o mesmo que a primeiraxargs
chamada, mas procurando uma sequência diferente.O uso de
xargs
evitará problemas onde existem tantos resultados que a linha de comando resultante do uso de back-ticks é muito longa.Para evitar os avisos, podemos redirecionar
stderr
para/dev/null
:Não é necessário nas chamadas grep subsequentes, porque
string1
já foi encontrado dentro do arquivo, portanto, as permissões são boas.fonte