Bu diğer cevap biraz kusurlu. Komut
find . -name '*.txt' | head -n 3
Sonra yorumlardan birinde bir açıklama var [benim vurgu]:
head
başlar ve borunun sol tarafından girişi bekler. Daha sonra find
başlar ve çıktısını borudan göndererek belirtilen ölçütlere uyan dosyaları arar. İstenilen head
satır sayısını alıp yazdırdığında, boruyu kapatarak sonlandırır. find
kapalı boruyu fark eder ve ayrıca sonlandırır. Basit, zarif ve verimli .
Bu neredeyse doğrudur.
Sorun find
kapalı boruyu sadece yazmaya çalıştığında fark ediyor - bu durumda 4. eşleşme bulunduğunda. Ama 4. maç yoksa o find
zaman devam edecek. Kabuğun bekleyecek!Bir komut dosyasında olursa, boru çıkışının son olduğunu zaten bildiğimiz ve buna hiçbir şey eklenemediğine rağmen komut dosyası bekler. O kadar verimli değil.
Bu özel ise etki ihmal edilebilir find
kendi başına hızlı bir şekilde bitirilirse ancak büyük bir dosya ağacında karmaşık arama ile komut, daha sonra yapmak istediğiniz her şeyi gereksiz yere geciktirebilir.
Mükemmel olmayan çözüm,
( find … & ) | head -n 3
Bu şekilde head
çıkış yapıldığında kabuk hemen devam eder. Arka plan find
işlemi yok sayılabilir (er ya da geç çıkacaktır) ya pkill
da bir şeyle hedeflenebilir .
Aradığınız konsepti ispatlamak için /
. Biz sadece bir maç bekliyoruz, ancak find
her yerde arar ve çok zaman alabilir.
find / -wholename / 2>/dev/null | head -n 1
Sorunu görür görmez Ctrl+ ile sonlandırın C. Şimdi karşılaştırın:
pidof find ; ( find / -wholename / 2>/dev/null & ) | head -n 1 ; pidof find
find . -name '*.txt' -print -quit
sadece ilk maçı göstermek ve izinfind
ilk maçtan sonra çıkış. "N eşleşme bulduktan sonra çık" durumuna uyum sağlamanın mümkün olup olmadığını bilmiyorum.