it-swarm-id.com

Bagaimana cara mencari teks di seluruh sistem file?

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?

56
Level1Coder

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.

68
Richard Downer

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.

  1. 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.

  2. 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
15
Caleb

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 /
3
bbaja42

Cara lain untuk melihatnya adalah dengan cara ini:

grep -r /* | grep "800x600"
2
maniat1k

* 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" /

0
Koffee