Existuje způsob, jak vynutit find
příkaz k zastavení ihned po nalezení první shody?
Přijatá odpověď:
S GNU nebo FreeBSD find
, můžete použít -quit
predikát:
find . ... -print -quit
NetBSD find
ekvivalent:
find . ... -print -exit
Pokud vše, co děláte, je tisk názvu a za předpokladu, že názvy souborů neobsahují znaky nového řádku, můžete:
find . ... -print | head -n 1
To nezastaví find
po prvním zápase, ale možná v závislosti na načasování a ukládání do vyrovnávací paměti při druhém zápase nebo (mnohem) později. V podstatě find
bude ukončeno SIGPIPE, když se pokusí něco odeslat, zatímco head
je již pryč, protože již přečetl a zobrazil první řádek vstupu.
Všimněte si, že ne všechny shelly budou čekat na tento find
příkaz za head
Vrátil se. Bourne shell a AT&T implementace ksh
(pokud není interaktivní) a yash
(pouze v případě, že je tento kanál posledním příkazem ve skriptu) by ne, ponechal by jej spuštěný na pozadí. Pokud byste raději viděli toto chování v jakémkoli shellu, můžete vždy změnit výše uvedené na:
(find . ... -print &) | head -n 1
Pokud děláte víc, než jen tisknete cesty k nalezeným souborům, můžete zkusit tento přístup:
find . ... -exec sh -c 'printf "%sn" "$1"; kill "$PPID"' sh {} ;
(nahraďte printf
s tím, co byste s tím souborem dělali).
To má vedlejší účinek find
vrací návratový stav odrážející skutečnost, že byl zabit.
Vlastně pomocí signálu SIGPIPE místo SIGTERM (kill -s PIPE
místo kill
) způsobí, že některé granáty budou o této smrti mlčet (ale stále vrátí nenulový výstupní stav).