Gostaria de saber se existe alguma maneira de incluir ou excluir arquivos dos resultados de find(1) com base na saída ou no código de saída de outro programa. Especificamente, gostaria de poder executar find(1) de forma que ele retorne apenas os arquivos que contenham uma correspondência positiva para uma expressão regular.
Sei que isso pode ser feito canalizando a saída de find(1) por meio de egrep, mas gostaria de poder fazer tudo isso de dentro de find(1).
Por exemplo, existe alguma maneira de converter o seguinte em uma única invocação de find(1) sem tubos?
find . [test] | xargs egrep -l [regex]
Responder1
-exec
avalia como "true" se o comando retornar zero (sucesso):
find . -type f -exec egrep -qs "regex" {} \; -print
Substitua -print
por uma ação de sua escolha.
Porém, considere que este modo egrep
é executado uma vez porcada arquivo. Comparar:
igual ~/código $ tempo find -type f -exec grep -qs bin/env {} \; -imprimir | wc-l 60 reais 0m0.760s usuário 0m0.104s sistema 0m0.596s
vs.
igual ~/código $ hora find -type f -print0 | xargs -0 egrep -l bin/env | wc-l 60 reais 0m0.021s usuário 0m0.003s sistema 0m0.023s
(Testado em um repositório Git bastante pequeno, 300 arquivos, aproximadamente 2,6 MB.)