grep -R
(kecuali untuk GNU dimodifikasi yang grep
ditemukan pada OS / X 10.8 dan di atas) mengikuti symlinks, jadi walaupun hanya ada 100GB file di ~/Documents
dalamnya, mungkin masih ada symlink /
untuk misalnya dan Anda akan akhirnya memindai seluruh sistem file termasuk file seperti /dev/zero
. Gunakan grep -r
dengan GNU yang lebih baru grep
, atau gunakan sintaks standar:
find ~/Documents -type f -exec grep Milledgeville /dev/null {} +
(Namun perhatikan bahwa status keluar tidak akan mencerminkan fakta bahwa polanya cocok atau tidak).
grep
menemukan garis yang sesuai dengan pola. Untuk itu, ia harus memuat satu baris sekaligus dalam memori. GNU grep
sebagai lawan dari banyak grep
implementasi lainnya tidak memiliki batasan pada ukuran baris yang dibaca dan mendukung pencarian dalam file biner. Jadi, jika Anda memiliki file dengan garis yang sangat besar (yaitu, dengan dua karakter baris baru yang sangat jauh), lebih besar dari memori yang tersedia, itu akan gagal.
Itu biasanya akan terjadi dengan file yang jarang. Anda dapat mereproduksinya dengan:
truncate -s200G some-file
grep foo some-file
Yang itu sulit untuk diselesaikan. Anda dapat melakukannya sebagai (masih dengan GNU grep
):
find ~/Documents -type f -exec sh -c 'for i do
tr -s "\0" "\n" < "$i" | grep --label="$i" -He "$0"
done' Milledgeville {} +
Itu mengubah urutan karakter NUL menjadi satu karakter baris baru sebelum memasukkan input ke grep
. Itu akan mencakup untuk kasus-kasus di mana masalahnya adalah karena file jarang.
Anda dapat mengoptimalkannya dengan melakukannya hanya untuk file besar:
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 {} + \)
Jika file tidak jarang dan Anda memiliki versi GNU grep
sebelumnya 2.6
, Anda dapat menggunakan --mmap
opsi. Garis-garis tersebut akan disimpan dalam memori sebagai lawan disalin di sana, yang berarti sistem selalu dapat mengklaim kembali memori dengan membuka halaman ke file. Opsi itu telah dihapus di GNU grep
2.6