¿Solo encuentra los primeros archivos coincidentes con find?

17

Digamos que puede haber cientos de *.txtarchivos en un directorio. Solo quiero encontrar los primeros tres *.txtarchivos y luego salir del proceso de búsqueda.

¿Cómo lograr esto usando la findutilidad? Tuve un rápido en su página de manual, no parecía una opción para esto.

mitnk
fuente
3
Solo puede usar find . -name '*.txt' -print -quitmostrar la primera coincidencia y dejar findsalir después de la primera coincidencia. No sé si es posible adaptarse al caso "salir después de encontrar n coincidencias".
NN

Respuestas:

22

Puede canalizar la salida de a findtravés de head:

find . -name '*.txt' | head -n 3
Chris Card
fuente
2
Sabía esto, quiero salir del proceso de búsqueda después de descubrir los primeros tres archivos coincidentes. Puede haber una gran cantidad de archivos coincidentes que no me importan.
mitnk
2
Creo que el comando find se termina una vez que head ha impreso los primeros 3 archivos
Chris Card
1
Sí, es extraño, pero tienes razón.
mitnk
19
No es nada extraño: es cómo funcionan las tuberías en UNIX. headse inicia y espera la entrada desde el lado izquierdo de la tubería. Luego se findinicia y busca archivos que coincidan con los criterios especificados, enviando su salida a través de la tubería. Cuando headha recibido e impreso el número de líneas solicitadas, finaliza y cierra la tubería. findnota la tubería cerrada y también termina. Simple, elegante y eficiente.
D_Bye
3
En resumen, -n 3es compatible con POSIX y, por lo tanto, es probable que sea más portátil.
l0b0
4

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]:

headse inicia y espera la entrada desde el lado izquierdo de la tubería. Luego se findinicia y busca archivos que coincidan con los criterios especificados, enviando su salida a través de la tubería. Cuando headha recibido e impreso el número de líneas solicitadas, finaliza y cierra la tubería. findnota la tubería cerrada y también termina. Simple, elegante y eficiente .

Esto es casi cierto.

El problema es que se findda 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 findtermina 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 headsale, el shell continúa de inmediato. El findproceso en segundo plano puede ser ignorado entonces (saldrá tarde o temprano) o apuntado con pkillo algo.


Para probar el concepto que puede buscar /. Esperamos una sola coincidencia, pero la findbusca 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
Kamil Maciorowski
fuente