Digamos que puede haber cientos de *.txt
archivos en un directorio. Solo quiero encontrar los primeros tres *.txt
archivos y luego salir del proceso de búsqueda.
¿Cómo lograr esto usando la find
utilidad? Tuve un rápido en su página de manual, no parecía una opción para esto.
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".Respuestas:
Puede canalizar la salida de a
find
través dehead
:fuente
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.-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
Luego hay una explicación en uno de los comentarios [énfasis mío]:
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 partidofind
, 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
De esta manera, cuando
head
sale, el shell continúa de inmediato. Elfind
proceso en segundo plano puede ser ignorado entonces (saldrá tarde o temprano) o apuntado conpkill
o algo.Para probar el concepto que puede buscar
/
. Esperamos una sola coincidencia, pero lafind
busca en todas partes y puede llevar mucho tiempo.Termine con Ctrl+ Ctan pronto como vea el problema. Ahora compara:
fuente