Dengan asumsi bahwa alat grep harus digunakan, saya ingin mencari string teks "800x600" di seluruh sistem file.
Saya mencoba:
grep -r 800x600 /
tetapi tidak berhasil.
Apa yang saya percaya harus saya lakukan adalah grep secara rekursif melalui semua file/folder di bawah root untuk teks "800x600" dan daftar hasil pencarian.
Apa yang saya lakukan salah?
Saya biasanya menggunakan gaya perintah ini untuk menjalankan grep
pada sejumlah file:
find / -xdev -type f -print0 | xargs -0 grep -H "800x600"
Apa yang sebenarnya dilakukan adalah membuat daftar setiap file pada sistem, dan kemudian untuk setiap file, jalankan grep
dengan argumen yang diberikan dan nama setiap file.
-xdev
argumen memberitahu menemukan bahwa ia harus mengabaikan sistem file lain - ini bagus untuk menghindari sistem file khusus seperti /proc
. Namun itu juga akan mengabaikan sistem file normal juga - jadi jika, misalnya, folder/home Anda berada di partisi yang berbeda, itu tidak akan dicari - Anda perlu mengatakan find / /home -xdev ...
.
-type f
berarti mencari file saja, jadi direktori, perangkat, dan file khusus lainnya diabaikan (masih akan muncul kembali ke direktori dan menjalankan grep
pada file di dalam - itu tidak akan menjalankan grep
pada direktori itu sendiri, yang tidak akan berhasil lagi). Dan -H
pilihan ke grep
memberitahukannya untuk selalu mencetak nama file dalam outputnya.
find
menerima segala macam opsi untuk memfilter daftar file. Sebagai contoh, -name '*.txt'
hanya memproses file yang diakhiri dengan .txt. -size -2M
berarti file yang lebih kecil dari 2 megabita. -mtime -5
berarti file yang dimodifikasi dalam lima hari terakhir. Gabungkan ini bersama dengan -a untuk dan dan -o untuk ata, dan gunakan '('
kurung ')'
untuk mengelompokkan ekspresi (dalam tanda kutip untuk mencegah Shell menafsirkannya). Jadi misalnya:
find / -xdev '(' -type f -a -name '*.txt' -a -size -2M -a -mtime -5 ')' -print0 | xargs -0 grep -H "800x600"
Melihat man find
untuk melihat daftar lengkap kemungkinan filter.
Biasanya Anda tidak ingin benar-benar mencari SEMUA pada sistem. Linux menggunakan node file untuk semuanya, jadi beberapa "file" bukanlah hal yang ingin Anda cari. Sebagai contoh /dev/sda
adalah perangkat blok fisik untuk hard drive pertama Anda. Anda mungkin ingin mencari sistem file yang dipasang bukan perangkat disk mentah. Juga ada /dev/random
yang mengeluarkan data acak setiap kali Anda membacanya. Pencarian yang tidak masuk akal. /proc
sistem file juga bermasalah dalam kasus Anda.
Saya akan merekomendasikan satu dari dua hal.
Jangan mencari di root, hanya mencari tempat yang mungkin berguna. Cari /home
atau /usr
atau /etc
terpisah. Info yang Anda cari kemungkinan jenis tertentu, jadi bagaimanapun juga kemungkinannya ada di folder tertentu. Pengaturan konfigurasi harus dalam /etc
. File data pribadi Anda harus dalam /home
. Membatasi pencarian ke area utama seperti ini akan sangat mengurangi masalah Anda dengan grep rekursif.
Kecualikan area yang bermasalah menggunakan --exclude-dir
dan serangkaian hal yang Anda tahu tidak Anda sukai seperti ini:grep -r --exclude-dir /proc --exclude-dir /dev --exclude-dir /tmp --exclude-dir /lost+found
Terakhir, itu tidak biasa untuk menemukan beberapa kesalahan 'izin-ditolak' ketika melakukan grep rekursif besar. Dalam penggunaan normal, ada file yang mungkin tidak dapat dibaca oleh pengguna Anda. Selama ini hanya beberapa file aneh dan bukan hal-hal seperti perangkat mentah untuk hard drive Anda atau seluruh sistem file proc, tidak apa-apa untuk mengabaikan kesalahan. Bahkan Anda bisa melakukan ini di command line dengan mengirim semua kesalahan ke tidak pernah mendarat:
grep -r search_string /path 2> /dev/null
Untuk kesederhanaan, saya sarankan ack-grep . Tautan menunjukkan banyak kasus ketika ack-grep
adalah opsi yang lebih baik.
Untuk digunakan adalah, setelah menginstal:
ack-grep pattern /
Cara lain untuk melihatnya adalah dengan cara ini:
grep -r /* | grep "800x600"
* kemudian saya mendapatkan pemicu/proc/sysrq: Input/output error
Perintah Anda berfungsi Anda mendapatkan kesalahan ini karena Anda mencoba memindai proses yang sedang berjalan untuk string.
Saya sarankan mengecualikan direktori sistem dengan
grep -exclude-dir = {proc, sys} "800x600" /