Estou tentando procurar arquivos que possuam pattern FW
. A partir desses arquivos filtrados, estou tentando pesquisar pattern chmod.*archive|archive.*chmod
e listá-los.
Tentei com o comando abaixo, mas não me deu a saída desejada. Preciso de ajuda para resolver esse problema.
find . -name '*FW*' -exec sh -c "cat {}|grep -iEq 'chmod.*archive|archive.*chmod'|ls" \;|more
Responder1
Se bem entendi, tudo que você precisa é:
find . -type f -name '*FW*' -exec grep -iEq 'chmod.*archive|archive.*chmod' {} \; -ls
Isso servirá grep
para o seu padrão em cada arquivo encontrado por find
e, se for grep
bem-sucedido, listará o arquivo em um formato semelhante a ls -l
.
Responder2
Como alternativa ao que @terdon propôs, você provavelmente também poderia usar o seguinte comando:
grep -iErl 'chmod.*archive|archive.*chmod' . | grep FW
EDITAR
Como @Kusalananda apontou:
Isso falharia (daria a saída errada) se você tivesse correspondências em arquivos localizados em diretórios que contenham FW em seus nomes.
Ajustá-lo para funcionar corretamente torna-o muito menos legível. A solução proposta por @terdon é uma opção mais favorável (também mais eficiente - veja o comentário de @tedron).
No entanto, aqui está uma versão corrigida:
grep -iErl 'chmod.*archive|archive.*chmod' . | grep -E '[^/]*FW[^/]*$'
Responder3
Você tem duas opções para obter os nomes de caminho que correspondem aos arquivos que possuem linhas que correspondem ao seu padrão:
Vamos
find
gerar os nomes dos caminhos:find . -name '*FW*' -type f \ -exec grep -q -i -e 'chmod.*archive' -e 'archive.*chmod' {} \; -print
Isso é executado
grep
em cada arquivo encontrado individualmente e, em seguida, imprime os nomes de caminho para cada arquivo que contém correspondências para o padrão (que, a propósito, transformei em um conjunto compatível com o padrão de duas expressões regulares básicas separadas, já que todo o resto na resposta era padrão).Provavelmente é isso que você gostaria de usar se quiser fazer outra coisa com os nomes de caminho além de apenas imprimi-los no terminal (basta adicionar mais
-exec
ações).Vamos
grep
gerar os nomes dos caminhos:find . -name '*FW*' -type f \ -exec grep -l -i -e 'chmod.*archive' -e 'archive.*chmod' {} +
Isso é executado
grep
em lotes de arquivos encontrados. Ogrep
utilitário reportará os nomes dos caminhos de cada arquivo correspondente, de acordo com sua-l
opção ("dash-ell").É provável que isso seja executado mais rapidamente, pois minimiza o número de
grep
invocações feitas e seria o que você faria se quisesse apenasolharnos nomes dos caminhos.