¿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).