grep -R( grepOS / X 10.8 ve üstünde bulunan değiştirilmiş GNU hariç ) sembolik bağlantıları izler, böylece sadece 100GB'lık dosyalar olsa bile ~/Documents, /örneğin bir sembolik bağlantı olabilir ve dosyalar dahil tüm dosya sistemini taramaya başlayabilirsiniz. gibi /dev/zero. Daha grep -ryeni GNU ile kullanın grepveya standart sözdizimini kullanın:
find ~/Documents -type f -exec grep Milledgeville /dev/null {} +
(ancak çıkış durumunun, kalıbın eşleşip eşleşmediğini yansıtmayacağını unutmayın).
grepdesenle eşleşen çizgileri bulur. Bunun için, hafızada bir seferde bir satır yüklemek zorundadır. grepDiğer birçok grepuygulamaya zıt olarak GNU , okuduğu satırların boyutuna sınır getirmez ve ikili dosyalarda aramayı destekler. Bu nedenle, çok büyük bir satırda (yani, çok uzaktaki iki yeni satır karakteriyle) bir dosya varsa, kullanılabilir bellekten daha büyükse, başarısız olur.
Bu genellikle seyrek bir dosya ile olur. Şununla çoğaltabilirsiniz:
truncate -s200G some-file
grep foo some-file
Bunu çözmek zor. Yapabilirsin (hala GNU ile grep):
find ~/Documents -type f -exec sh -c 'for i do
tr -s "\0" "\n" < "$i" | grep --label="$i" -He "$0"
done' Milledgeville {} +
Bu, girişi beslemeden önce NUL karakter dizilerini bir yeni satır karakterine dönüştürür grep. Sorunun seyrek dosyalardan kaynaklandığı durumları kapsar.
Yalnızca büyük dosyalar için yaparak optimize edebilirsiniz:
find ~/Documents -type f \( -size -100M -exec \
grep -He Milledgeville {} + -o -exec sh -c 'for i do
tr -s "\0" "\n" < "$i" | grep --label="$i" -He "$0"
done' Milledgeville {} + \)
Dosyalar seyrek değilse ve grepöncesinde bir GNU sürümü 2.6varsa, --mmapseçeneği kullanabilirsiniz . Satırlar orada kopyalandığından ziyade belleğe eşleştirilecektir, bu da sistemin her zaman sayfaları sayfalara ayırarak belleği geri alabileceği anlamına gelir. Bu seçenek GNU grep2.6’da kaldırıldı