İle find
:
cd /the/dir
find . -type f -exec grep pattern {} +
( -type f
yalnızca normal dosyalarda arama yapmaktır ( normal dosyaları işaret etseler bile sembolik bağlantılar hariç). Dizinler dışında herhangi bir dosya türünde arama yapmak istiyorsanız (ancak fifos veya / dev / zero gibi bazı dosya türlerine dikkat edin) genellikle okumak istemezseniz) -type f
GNU'ya özel değiştirin ! -xtype d
( symlink çözümlemesinden sonra -xtype d
tür dizini dosyaları için eşleşir ).
GNU ile grep
:
grep -r pattern /the/dir
(ancak GNU grep'in yeni bir sürümüne sahip değilseniz, dizinlere inerken sembolik bağlantıları izleyeceğini unutmayın). Bir -D read
seçenek eklemediğiniz sürece normal olmayan dosyalar aranmaz . GNU'nun son sürümleri grep
yine de sembolik bağlantılarda arama yapmayacaktır.
GNU'nun çok eski sürümleri find
standart {} +
sözdizimini desteklemedi , ancak orada standart dışı kullanabilirsiniz:
cd /the/dir &&
find . -type f -print0 | xargs -r0 grep pattern
Performansların G / Ç'ye bağlı olması muhtemeldir. Arama yapmanın tam zamanı, depolama alanındaki tüm verileri okumak için gereken zamandır.
Veriler yedekli bir disk dizisindeyse, aynı anda birkaç dosyayı okumak performansı artırabilir (ve aksi takdirde bozulabilir). Performanslar G / Ç'ye bağlı değilse (örneğin tüm veriler önbellekte olduğundan) ve birden fazla CPU'nuz varsa, eşzamanlı greps
da yardımcı olabilir. Sen GNU ile yapabilirsiniz xargs
'ın -P
seçeneği.
Örneğin, veriler 3 sürücülü bir RAID1 dizisindeyse veya veriler önbellekte bulunuyorsa ve zamanları yedeklenecek 3 CPU'nuz varsa:
cd /the/dir &&
find . -type f -print0 | xargs -n1000 -r0P3 grep pattern
(Burada kullanarak -n1000
yeni yumurtlamaya grep
bir anda paralel çalışan en fazla 3, her 1000 dosyaları).
Bununla birlikte, çıktısı grep
yeniden yönlendirilirse, 3 grep
işlemden hatalı serpiştirilmiş çıktı elde edeceğinizi unutmayın; bu durumda şu şekilde çalıştırmak isteyebilirsiniz:
find . -type f -print0 | stdbuf -oL xargs -n1000 -r0P3 grep pattern
(yeni bir GNU veya FreeBSD sisteminde) veya --line-buffered
GNU seçeneğini kullanın grep
.
Eğer pattern
sabit bir dize, ekleme -F
seçeneği konularda artırabilir.
Çok baytlı karakter verisi değilse veya bu desenin eşleşmesi için verilerin çok baytlı karakter olup olmadığı önemli değildir, o zaman:
cd /the/dir &&
LC_ALL=C grep -r pattern .
performansı önemli ölçüde artırabilir.
Bu tür aramaları sık sık yaparsanız, oradaki birçok arama motorundan birini kullanarak verilerinizi dizine eklemek isteyebilirsiniz.
find
ile kullanınxargs
grep -R