Me pregunto si hay alguna forma de incluir o excluir archivos de los resultados de find(1) en función de la salida o el código de salida de otro programa. Específicamente, me gustaría poder ejecutar find(1) de manera que devuelva solo aquellos archivos que contengan una coincidencia positiva para una expresión regular.
Me doy cuenta de que esto se puede lograr canalizando la salida de find(1) a través de egrep, pero me gustaría poder hacerlo todo desde find(1).
Por ejemplo, ¿hay alguna forma de convertir lo siguiente en una única invocación de find(1) sin tuberías?
find . [test] | xargs egrep -l [regex]
Respuesta1
-exec
se evalúa como "verdadero" si el comando devuelve cero (éxito):
find . -type f -exec egrep -qs "regex" {} \; -print
Reemplace -print
con la acción de su elección.
Sin embargo, considere que esta forma egrep
se ejecuta una vez porcada archivo. Comparar:
igual ~/código $ tiempo buscar -tipo f -exec grep -qs bin/env {} \; -imprimir | baño -l 60 reales 0m0.760s usuario 0m0.104s sistema 0m0.596s
vs.
igual ~/código $ tiempo buscar -tipo f -print0 | xargs -0 egrep -l bin/env | baño -l 60 reales 0m0.021s usuario 0m0.003s sistema 0m0.023s
(Probado en un repositorio Git bastante pequeño, 300 archivos, ~2,6 MB).