Emin değilim:
grep -r -i 'the brown dog' /*
Gerçekten demek istediğin. Bu, gizli olmayan tüm dosyalarda ve dizinlerde özyinelemeli grep anlamına gelir /
(ama yine de içindeki gizli dosyalara ve dizinlere bakın).
Demek istediğini varsayalım:
grep -r -i 'the brown dog' /
Unutulmaması gereken birkaç şey:
- Tüm
grep
uygulamalar desteklemiyor -r
. Ve bunu yapanlar arasında davranışlar farklıdır: bazıları dizin ağacını geçerken dizinlere sembolik bağlantılar izler (bu, aynı dosyada birkaç kez bakmanız veya hatta sonsuz döngülerde çalıştırmanız anlamına gelir), bazıları olmaz. Bazıları aygıt dosyalarına bakacak (ve /dev/zero
örneğin oldukça zaman alacaktır ) veya borular ya da ikili dosyalar ...
- Gibi verimlidir
grep
kısa sürede onları keşfeder olarak içindeki dosyaları aramaya başlar. Ancak bir dosyaya bakarken, aranacak başka dosya aramıyor (çoğu durumda olduğu gibi muhtemelen)
Sizin:
find / -type f -exec grep -i 'the brown dog' {} \;
( -r
burada hangi anlam ifade etmedi kaldırıldı ) korkunç verimsiz çünkü grep
dosya başına bir tane çalışıyoruz . ;
sadece bir argüman kabul eden komutlar için kullanılmalıdır. Üstelik burada, grep
sadece bir dosyaya bakıldığı için dosya adını yazmaz, böylece eşleşmelerin nerede olduğunu bilemezsiniz.
Cihaz dosyalarına, borulara, sembolik bağlantılara bakmıyorsunuz ..., sembolik bağlantılara uymuyorsunuz, ama yine de potansiyel olarak içindeki şeylere bakıyorsunuz /proc/mem
.
find / -type f -exec grep -i 'the brown dog' {} +
Çok daha iyi olurdu çünkü grep
mümkün olduğu kadar az komut çalıştırılacaktı. Son çalıştırmada yalnızca bir dosya yoksa, dosya adını alırsınız. Bunun için kullanmak daha iyidir:
find / -type f -exec grep -i 'the brown dog' /dev/null {} +
veya GNU ile grep
:
find / -type f -exec grep -Hi 'the brown dog' {} +
Çiğnemek için yeterli dosya grep
bulana kadar başlatılmayacağını unutmayın find
, bu nedenle başlangıçta bir gecikme olacaktır. Ve bir find
daha grep
geri dönene kadar daha fazla dosya aramaya devam etmeyecek . Büyük dosya listesinin tahsis edilmesi ve aktarılması bazı (muhtemelen ihmal edilebilir) bir etkiye sahiptir, bu yüzden hepsinde, muhtemelen grep -r
linke uymayan veya cihazların içine bakmayan birinden daha az verimli olacaktır .
GNU araçlarıyla:
find / -type f -print0 | xargs -r0 grep -Hi 'the brown dog'
Yukarıdaki gibi, grep
mümkün olduğu kadar az örnek çalıştırılacak, ancak find
ilk grep
çağrı ilk toplu işin içine bakarken daha fazla dosya aramaya devam edecek . Bu olsa da bir avantaj olabilir veya olmayabilir. Örneğin, dönme sabit diskler üzerinde depolanan verilerin, ile find
ve grep
diskte farklı konumlarda depolanan erişen verileri sürekli hareket etmesine disk kafası neden olarak, disk verim yavaşlayacaktır. Bir RAID kurulumunda ( farklı disklere erişebilir find
ve grep
erişebilir) veya SSD'lerde, bu olumlu bir fark yaratabilir.
Bir RAID kurulumunda, birkaç eşzamanlı grep
çağrı yürütmek de işleri iyileştirebilir. Hala 3 diskli RAID1 depolama alanındaki GNU araçlarıyla,
find / -type f -print0 | xargs -r0 -P2 grep -Hi 'the brown dog'
performansı önemli ölçüde artırabilir. Ancak ikincisinin grep
yalnızca ilk grep
komutu doldurmaya yetecek kadar dosya bulunduğunda başlatılacağını unutmayın . Bunun daha erken gerçekleşmesi için bir -n
seçenek ekleyebilirsiniz xargs
(ve grep
çağrı başına daha az dosya iletir).
Ayrıca, xargs
çıkışı bir terminal cihazından başka bir şeye yönlendiriyorsanız , greps
s çıkışlarını tamponlamaya başlayacaktır; bu, bunların çıkışının grep
muhtemelen yanlış bir şekilde birleştirileceği anlamına gelir . stdbuf -oL
Etrafında çalışmak için (GNU veya FreeBSD'de olduğu gibi) kullanmanız gerekecek (hala çok uzun çizgilerle (tipik olarak> 4KiB) problemleriniz olabilir) veya her birinin çıktılarını ayrı bir dosyaya yazıp birleştirme yapmalısınız. hepsi sonunda.
Burada, aradığınız dize sabittir (bir regexp değil), bu nedenle -F
seçeneği kullanmak bir fark yaratabilir ( grep
uygulamaların zaten bunu nasıl optimize edeceğini bilmesi olası değildir ).
Büyük bir fark yaratabilecek başka bir şey, çok baytlık bir yerel ayardaysanız yerel ayarı C'ye sabitlemektir:
find / -type f -print0 | LC_ALL=C xargs -r0 -P2 grep -Hi 'the brown dog'
İçine bakarak önlemek için /proc
, /sys
..., kullanmak -xdev
içeri aramak istediğiniz dosya sistemleri ve belirtin:
LC_ALL=C find / /home -xdev -type f -exec grep -i 'the brown dog' /dev/null {} +
Ya da açıkça dışlamak istediğiniz yolları bulayın:
LC_ALL=C find / \( -path /dev -o -path /proc -o -path /sys \) -prune -o \
-type f -exec grep -i 'the brown dog' /dev/null {} +