C'è un modo per forzare il find
comando per interrompere subito dopo aver trovato la prima corrispondenza?
Risposta accettata:
Con GNU o FreeBSD find
, puoi usare il -quit
predicato:
find . ... -print -quit
Il NetBSD find
equivalente:
find . ... -print -exit
Se tutto ciò che fai è stampare il nome e supponendo che i nomi dei file non contengano caratteri di nuova riga, puoi fare:
find . ... -print | head -n 1
Ciò non fermerà find
dopo la prima partita, ma possibilmente, a seconda dei tempi e del buffering della seconda partita o (molto) dopo. Fondamentalmente, find
verrà terminato con un SIGPIPE quando tenta di produrre qualcosa mentre head
è già andato perché ha già letto e visualizzato la prima riga di input.
Nota che non tutte le shell aspetteranno quel find
comando dopo head
è ritornato. La shell Bourne e le implementazioni AT&T di ksh
(quando non interattivo) e yash
(solo se quella pipeline è l'ultimo comando in uno script) non lo farebbe, lasciandolo in esecuzione in background. Se preferisci vedere quel comportamento in qualsiasi shell, puoi sempre modificare quanto sopra in:
(find . ... -print &) | head -n 1
Se stai facendo di più che stampare i percorsi dei file trovati, puoi provare questo approccio:
find . ... -exec sh -c 'printf "%sn" "$1"; kill "$PPID"' sh {} ;
(sostituisci printf
con qualunque cosa faresti con quel file).
Questo ha l'effetto collaterale di find
restituendo uno stato di uscita che riflette il fatto che è stato ucciso.
In realtà, usando il segnale SIGPIPE invece di SIGTERM (kill -s PIPE
invece di kill
) farà sì che alcuni proiettili tacciano di più su quella morte (ma restituirebbero comunque uno stato di uscita diverso da zero).