¿Hay alguna forma de forzar find
? comando para detenerse justo después de encontrar la primera coincidencia?
Respuesta aceptada:
Con GNU o FreeBSD find
, puede usar -quit
predicado:
find . ... -print -exit
find
de NetBSD equivalente:
find . ... -print -exit
Si todo lo que hace es imprimir el nombre y suponiendo que los nombres de los archivos no contienen caracteres de nueva línea, podría hacer lo siguiente:
find . ... -print | head -n 1
Eso no detendrá find
después del primer partido, pero posiblemente, dependiendo del tiempo y el almacenamiento en búfer en el segundo partido o (mucho) más tarde. Básicamente, find
terminará con un SIGPIPE cuando intente generar algo mientras head
ya se ha ido porque ya ha leído y mostrado la primera línea de entrada.
Tenga en cuenta que no todos los shells esperarán a que find
comando después de head
ha regresado. Las implementaciones de Bourne Shell y AT&T de ksh
(cuando no es interactivo) y yash
(solo si esa tubería es el último comando en un script) no lo haría, dejándolo ejecutándose en segundo plano. Si prefiere ver ese comportamiento en cualquier shell, siempre puede cambiar lo anterior a:
(find . ... -print &) | head -n 1
Si está haciendo algo más que imprimir las rutas de los archivos encontrados, puede probar este enfoque:
find . ... -exec sh -c 'printf "%sn" "$1"; kill "$PPID"' sh {} ;
(reemplace printf
con lo que sea que estarías haciendo con ese archivo).
Eso tiene el efecto secundario de find
devolviendo un estado de salida que refleja el hecho de que fue eliminado.
En realidad, usar la señal SIGPIPE en lugar de SIGTERM (kill -s PIPE
en lugar de kill
) hará que algunos proyectiles guarden más silencio sobre esa muerte (pero aún devolverán un estado de salida distinto de cero).