Există o modalitate de a forța "găsi" comandă pentru a opri imediat după găsirea primul meci?
Cu GNU sau FreeBSD "găsi", puteți utiliza -quit
predicat:
find . ... -print -quit
La NetBSD "găsi" echivalent:
find . ... -print -exit
Dacă tot ce faci este imprimarea numele, și presupunând că numele de fișiere nu't conține caractere newline, ai putea face:
find . ... -print | head -n 1
Care nu se va opri "găsi" după primul meci, dar, eventual, în funcție de calendarul și de tamponare la cel de-al doilea meci sau (mult) mai târziu. Practic, "găsi" va fi încheiată cu un SIGPIPE atunci când încearcă pentru a afișa ceva în timp ce "capul" este deja plecat, deoarece are deja citite și afișate pe prima linie de intrare.
Rețineți că nu toate cojile va aștepta pentru că "găsi" comandă după ce "șeful" s-a întors. The Bourne shell și AT&T implementări de ksh(atunci când non-interactiv) și
yash` (numai în cazul în care conducta este ultima comandă într-un script) nu ar fi, lăsându-l rulează în fundal. Daca'd vedea mai degrabă că comportamentul în orice shell, ai putea schimba de mai sus pentru:
(find . ... -print &) | head -n 1
Daca're face mai mult decât tipărirea căi de fișiere găsite, ai putea încerca această abordare:
find . ... -exec sh -c 'printf "%s\n" "$1"; kill "$PPID"' sh {} \;
(înlocuiți "printf" cu ce ai putea face cu acel fișier).
Care are efectul secundar de a "găsi" întorcându-se de o ieșire de stare reflectând faptul că acesta a fost omorât.
De fapt, folosind semnalul SIGPIPE în loc de SIGTERM (`ucide -s ȚEAVĂ "în loc de" omor) va provoca unele scoici pentru a fi mai tăcut despre moarte (dar tot ar reveni un non-zero exit status).
find . -name something -print -quit
Termină găsi după primul meci după imprimare-l.
Termina găsi după un anumit număr de meciuri și rezultate de imprimare:
find . -name something -print | head -n 5
Destul de surprinzător cap - de-acum termină șirul după 5 meciuri, deși nu știu cum sau de ce.
Este foarte ușor pentru a testa. Doar să găsească căutare o pe rădăcină, care ar duce mii, poate chiar mai multe meciuri în timp ce lua cel puțin un minut sau mai mult. Dar când prin conducte în "cap" "găsi" va termina după cantitatea specificată de linii definite în cap (default capul prezinta 10, utilizați "capul -n" pentru a specifica linii).
Rețineți că acest lucru se va termina după "capul -n" ajunge specificat newline conta și, prin urmare, orice meci care conține mai multe caractere newline va conta în mod corespunzător.
Pentru scopuri de divertisment, aici's un leneș găsi generator în Bash. Acest exemplu generează un inel peste fișierele din directorul curent. Citește cu toate acestea de multe doriți, apoi ucide %+` (poate doar 1)
#!/usr/bin/env bash
unset -v files n
trap 'kill "$x_PID"' EXIT
coproc x while :; do
find . -type f -maxdepth 1 -exec sh -c "$(</dev/fd/3)" _ {} +
done 4<&0 <<\EOF 3<&0 <&4-
for x; do
read -r _
printf '%s\0' "$x"
done
EOF
while
echo >&${x[1]}
IFS= read -rd '' -u "$x" 'files[n++]'
do
printf '%q ' "${files[@]}"
echo
sleep .2
done
grep revine, de asemenea, dacă este folosit cu steagul -m
, deci cu
find stuff | grep -m1 .
va reveni după prima linie de imprimat de găsit.
Diferența dintre aceasta și de a găsi lucruri -print-quit | cap -1` este că, în cazul în care căutarea este suficient de rapid grep-ar putea să nu fie în măsură să oprească în timp a procesului (nu't contează cu adevărat, deși), în timp ce în cazul în care căutarea este mult va cruța găsi pentru a imprima o mulțime de care nu sunt necesare linii.
acest loc funcționează cu busybox găsi, deși din busybox grep, de asemenea, a -m
, nu este cu adevărat necesar
find /tmp/stuff -exec "sh" "-c" "eval 'echo {}; { kill \$PPID; }'" \;
acest lucru va scuipa un mesaj despre găsi proces după ce a primit (de obicei) semnal sigterm, dar această ieșire aparține de funcționare shell, nu comanda asa ca nu te pui cu ieșire de comandă, în sensul conducte sau redirecționează va afișa doar o linie de potrivire de găsit.