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
grepuygulamalar 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
grepkı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' {} \;
( -rburada hangi anlam ifade etmedi kaldırıldı ) korkunç verimsiz çünkü grepdosya başına bir tane çalışıyoruz . ;sadece bir argüman kabul eden komutlar için kullanılmalıdır. Üstelik burada, grepsadece 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ü grepmü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 grepbulana kadar başlatılmayacağını unutmayın find, bu nedenle başlangıçta bir gecikme olacaktır. Ve bir finddaha grepgeri 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 -rlinke 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, grepmümkün olduğu kadar az örnek çalıştırılacak, ancak findilk 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 findve grepdiskte 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 findve greperiş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 grepyalnızca ilk grepkomutu doldurmaya yetecek kadar dosya bulunduğunda başlatılacağını unutmayın . Bunun daha erken gerçekleşmesi için bir -nseç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 , grepss çıkışlarını tamponlamaya başlayacaktır; bu, bunların çıkışının grepmuhtemelen yanlış bir şekilde birleştirileceği anlamına gelir . stdbuf -oLEtrafı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 -Fseçeneği kullanmak bir fark yaratabilir ( grepuygulamaları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 -xdeviç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 {} +