grep -R
( grep
OS / 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 -r
yeni GNU ile kullanın grep
veya 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).
grep
desenle eşleşen çizgileri bulur. Bunun için, hafızada bir seferde bir satır yüklemek zorundadır. grep
Diğer birçok grep
uygulamaya 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.6
varsa, --mmap
seç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 grep
2.6’da kaldırıldı