Sadece bul ile ilk eşleşen dosyaları bul?


17

*.txtBir dizinde yüzlerce dosya olabileceğini varsayalım. Yalnızca ilk üç *.txtdosyayı bulmak ve sonra arama işleminden çıkmak istiyorum .

findYardımcı programı kullanarak bunu nasıl başarabilirim ? Adam sayfasında hızlı bir şekilde geçirdim, bunun için böyle bir seçenek görünmüyordu.


3
Sen kullanabilirsiniz find . -name '*.txt' -print -quitsadece ilk maçı göstermek ve izin findilk maçtan sonra çıkış. "N eşleşme bulduktan sonra çık" durumuna uyum sağlamanın mümkün olup olmadığını bilmiyorum.
NN

Yanıtlar:


22

findYoluyla çıkış boru olabilir head:

find . -name '*.txt' | head -n 3

2
Bunu biliyordum, ilk üç eşleşen dosyayı bulduktan sonra arama işleminden çıkmak istiyorum. Umurumda değil çok büyük miktarda eşleşen dosyalar olabilir.
mitnk

2
Kafa ilk 3 dosyayı yazdırdığında bul komutunun sonlandırıldığını düşünüyorum
Chris Card

1
Evet, garip, ama haklısın.
mitnk

19
Hiç garip değil - boruların UNIX'te nasıl çalıştığı. headbaşlar ve borunun sol tarafından girişi bekler. Daha sonra findbaşlar ve çıktısını borudan göndererek belirtilen ölçütlere uyan dosyaları arar. İstenilen headsatır sayısını alıp yazdırdığında, boruyu kapatarak sonlandırır. findkapalı boruyu fark eder ve ayrıca sonlandırır. Basit, zarif ve verimli.
19:13

3
Özetlemek gerekirse, -n 3bir POSIX uyumlu ve bu nedenle büyük olasılıkla daha taşınabilir olması.
19.03.2015

4

Bu diğer cevap biraz kusurlu. Komut

find . -name '*.txt' | head -n 3

Sonra yorumlardan birinde bir açıklama var [benim vurgu]:

headbaşlar ve borunun sol tarafından girişi bekler. Daha sonra findbaşlar ve çıktısını borudan göndererek belirtilen ölçütlere uyan dosyaları arar. İstenilen headsatır sayısını alıp yazdırdığında, boruyu kapatarak sonlandırır. findkapalı boruyu fark eder ve ayrıca sonlandırır. Basit, zarif ve verimli .

Bu neredeyse doğrudur.

Sorun findkapalı boruyu sadece yazmaya çalıştığında fark ediyor - bu durumda 4. eşleşme bulunduğunda. Ama 4. maç yoksa o findzaman 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 findişlemi yok sayılabilir (er ya da geç çıkacaktır) ya pkillda bir şeyle hedeflenebilir .


Aradığınız konsepti ispatlamak için /. Biz sadece bir maç bekliyoruz, ancak findher 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
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.