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