Bagaimana cara mencari teks di seluruh sistem file?

53

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?

Level1Coder
sumber
2
Dan dengan "itu tidak berhasil" maksudmu persis apa? Apakah itu tidak mencetak output, hang atau mencetak banyak Permission deniedkesalahan? Apakah Anda menjalankannya sebagai root atau pengguna biasa?
alex
Saya mendapatkan daya tarik, pertama-tama saya berada di direktori home user saya mencoba menjalankan perintah. Jadi sekarang saya sudah cd / keluar untuk root. Selanjutnya saya mencoba perintah yang sama seperti di atas dan saya mendapatkan banyak Izin yang ditolak kesalahan. Ok, jadi sekarang saya mencoba sudo grep -r 800x600 / dan kemudian saya mendapatkan / proc / sysrq-trigger: Kesalahan input / output
Level1Coder
Hmm, tidak tahu mengapa itu tidak berhasil. Anda dapat mengabaikan kesalahan akses dengan melakukan grep -r 800x600 / 2>/dev/null. Anda juga dapat mencoba menjalankannya sebagai root.
Totor

Jawaban:

64

Saya biasanya menggunakan gaya perintah ini untuk menjalankan grepbeberapa 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 grepdengan argumen yang diberikan dan nama setiap file.

The -xdevArgumen mengatakan menemukan bahwa itu harus mengabaikan filesystem lain - ini baik untuk menghindari filesystem 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 mengatakannya find / /home -xdev ....

-type fberarti mencari file saja, sehingga direktori, perangkat, dan file khusus lainnya diabaikan (masih akan muncul kembali menjadi direktori dan dieksekusi greppada file dalam - itu tidak akan dieksekusi greppada direktori itu sendiri, yang tidak akan berfungsi lagi). Dan -Hopsi untuk grepmemberitahu itu untuk selalu mencetak nama file dalam outputnya.

findmenerima segala macam opsi untuk memfilter daftar file. Misalnya, -name '*.txt'hanya memproses file yang diakhiri dengan .txt. -size -2Mberarti file yang lebih kecil dari 2 megabita. -mtime -5berarti file yang dimodifikasi dalam lima hari terakhir. Gabungkan ini bersama dengan -a untuk dan dan -o untuk atau , dan gunakan '('tanda kurung ')'untuk ekspresi grup (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"

Lihatlah man finduntuk melihat daftar lengkap kemungkinan filter.

Richard Downer
sumber
2
Catatan yang -xdevakan mengecualikan semua sistem file lain, bukan hanya yang khusus. (misalnya, jika Anda telah /homememasang sebagai partisi yang terpisah, itu tidak akan dicari.)
cjm
Saya mencoba menjalankan masing-masing tetapi keduanya mengembalikan kesalahan -find: paths must precede expression: /
Level1Coder
1
Catatan: Ketika ekspresi reguler tidak diperlukan 'fgrep' secara signifikan lebih cepat daripada 'grep', yang akan membuat perbedaan besar jika Anda mencari pohon besar.
Nathan Kidd
1
Anda dapat menghindari melalui xargsdengan efisiensi yang lebih baik dengan melakukan find / -xdev -type f -exec grep -H '800x600' +.
Totor
3
Tidak, +tanda di akhir findperintah sebenarnya melakukan hal yang sama seperti xargs: ia memunculkan satu grepproses dengan beberapa argumen.
Totor
14

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. Misalnya /dev/sdaadalah perangkat blok fisik untuk hard drive pertama Anda. Anda mungkin ingin mencari sistem file yang dipasang bukan perangkat disk mentah. Juga ada /dev/randomyang mengeluarkan data acak setiap kali Anda membacanya. Pencarian yang tidak masuk akal. Sistem /procfile juga bermasalah dalam kasus Anda.

Saya akan merekomendasikan satu dari dua hal.

  1. Jangan mencari di root, hanya mencari tempat yang mungkin berguna. Cari /homeatau /usratau /etcseparatly. Info yang Anda cari kemungkinan jenis tertentu, jadi bagaimanapun juga itu kemungkinan berada 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.

  2. Kecualikan area bermasalah menggunakan --exclude-dirdan satu set hal yang Anda tahu Anda tidak perlu suka 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, boleh saja 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
Caleb
sumber
3
-Iuntuk mengecualikan biner
Rahul Patil
2

Untuk kesederhanaan, saya sarankan ack-grep . Tautan menunjukkan banyak kasus ketika ack-grepmerupakan pilihan yang lebih baik.

Untuk digunakan adalah, setelah menginstal:

ack-grep pattern /
bbaja42
sumber
Terima kasih telah merekomendasikan ini, tetapi saya menjalankan ini dan itu tidak benar-benar memberi saya hasil pencarian yang saya perkirakan. Sepertinya saya perlu mengubah banyak pengaturan untuk mendapatkan apa yang saya inginkan. Sampai sekarang jawaban Richard bekerja langsung di luar kotak. Akan melihat ini di masa depan karena tampaknya bermanfaat juga.
Level1Coder
1

Cara lain untuk melihatnya adalah dengan cara ini:

grep -r /* | grep "800x600"
maniat1k
sumber
0

* kemudian saya mendapatkan pemicu / proc / sysrq: Input / output error

Perintah Anda berfungsi Anda mendapatkan kesalahan ini karena Anda mencoba untuk memindai proses yang sedang berjalan untuk string.

Saya sarankan mengecualikan direktori sistem dengan

grep -exclude-dir = {proc, sys} "800x600" /

Koffee
sumber
-3

hanya benar-

grep -r "800x600" /

-Apa yang salah dalam perintah Anda saat ini adalah tanda kutip, "". Selalu berikan argumen string ke grepdalam tanda kutip.

Amita
sumber
3
Ini bukan masalah di sini. Anda tidak perlu mengutip ketika memberikan jenis argumen khusus ini grep. Cobalah dan Anda akan lihat. Masukkan string "800x600" dalam file dan kemudian grep 800x600 filedan Anda akan melihatnya berfungsi dengan baik. OP jelas memiliki masalah lain.
slm