Respuestas:
Puede canalizar la salida de a find
través de head
:
find . -name '*.txt' | head -n 3
head
se inicia y espera la entrada desde el lado izquierdo de la tubería. Luego se find
inicia y busca archivos que coincidan con los criterios especificados, enviando su salida a través de la tubería. Cuando head
ha recibido e impreso el número de líneas solicitadas, finaliza y cierra la tubería. find
nota la tubería cerrada y también termina. Simple, elegante y eficiente.
-n 3
es compatible con POSIX y, por lo tanto, es probable que sea más portátil.
Esta otra respuesta es algo defectuosa. El comando es
find . -name '*.txt' | head -n 3
Luego hay una explicación en uno de los comentarios [énfasis mío]:
head
se inicia y espera la entrada desde el lado izquierdo de la tubería. Luego sefind
inicia y busca archivos que coincidan con los criterios especificados, enviando su salida a través de la tubería. Cuandohead
ha recibido e impreso el número de líneas solicitadas, finaliza y cierra la tubería.find
nota la tubería cerrada y también termina. Simple, elegante y eficiente .
Esto es casi cierto.
El problema es que se find
da cuenta de la tubería cerrada solo cuando intenta escribir en ella, en este caso es cuando se encuentra la cuarta coincidencia. Pero si no hay cuarto partido find
, continuará. ¡Tu caparazón esperará! Si ocurre en un script, el script esperará, a pesar del hecho de que ya sabemos que la salida de la tubería es final y no se le puede agregar nada. No tan eficiente.
El efecto es insignificante si este particular find
termina rápidamente por sí mismo, pero con una búsqueda compleja en un gran árbol de archivos, el comando puede retrasar innecesariamente lo que quiera hacer a continuación.
La solución no tan perfecta es correr
( find … & ) | head -n 3
De esta manera, cuando head
sale, el shell continúa de inmediato. El find
proceso en segundo plano puede ser ignorado entonces (saldrá tarde o temprano) o apuntado con pkill
o algo.
Para probar el concepto que puede buscar /
. Esperamos una sola coincidencia, pero la find
busca en todas partes y puede llevar mucho tiempo.
find / -wholename / 2>/dev/null | head -n 1
Termine con Ctrl+ Ctan pronto como vea el problema. Ahora compara:
pidof find ; ( find / -wholename / 2>/dev/null & ) | head -n 1 ; pidof find
find . -name '*.txt' -print -quit
mostrar la primera coincidencia y dejarfind
salir después de la primera coincidencia. No sé si es posible adaptarse al caso "salir después de encontrar n coincidencias".