Primeiro, tenha em atenção que, por engano, usou =
em vez do ==
correto.
Você não precisa de xargs
, pode executar diretamente de find
. Além disso, o awk
deve sair assim que processar a linha 2, em vez de ler todo o arquivo.
find /path -type f -exec awk 'FNR == 2 && /^regular expression$/ {print FILENAME}; FNR == 2 {nextfile}' '{}' +
O +
no final do argumento -exec
instrui find
a colocar quantos argumentos de nome de arquivo forem possíveis. À-la xargs
. Consulte a documentação find
.
O ponto importante aqui é FNR==2 {nextfile}
.
Se -exec
é melhor que xargs
(mas use -print0
& -0
, se disponível) está sujeito a discussões. Por um lado, find … | xargs …
permite alguma paralelização com find
lendo mais alguns nomes de arquivos, enquanto awk
inspeciona um lote anterior. Por outro lado, a paralelização pode resultar em lixo ruim com awk
e find
competindo por diferentes faixas do disco. Seu hardware (tamanho do cache, SSD, etc.) mudará o acordo. O perfil decide então.