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?
Permission denied
kesalahan? Apakah Anda menjalankannya sebagai root atau pengguna biasa?grep -r 800x600 / 2>/dev/null
. Anda juga dapat mencoba menjalankannya sebagai root.Jawaban:
Saya biasanya menggunakan gaya perintah ini untuk menjalankan
grep
beberapa file: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.The
-xdev
Argumen 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 mengatakannyafind / /home -xdev ...
.-type f
berarti mencari file saja, sehingga direktori, perangkat, dan file khusus lainnya diabaikan (masih akan muncul kembali menjadi direktori dan dieksekusigrep
pada file dalam - itu tidak akan dieksekusigrep
pada direktori itu sendiri, yang tidak akan berfungsi lagi). Dan-H
opsi untukgrep
memberitahu itu untuk selalu mencetak nama file dalam outputnya.find
menerima segala macam opsi untuk memfilter daftar file. Misalnya,-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 atau , dan gunakan'('
tanda kurung')'
untuk ekspresi grup (dalam tanda kutip untuk mencegah shell menafsirkannya). Jadi misalnya:Lihatlah
man find
untuk melihat daftar lengkap kemungkinan filter.sumber
-xdev
akan mengecualikan semua sistem file lain, bukan hanya yang khusus. (misalnya, jika Anda telah/home
memasang sebagai partisi yang terpisah, itu tidak akan dicari.)find: paths must precede expression: /
xargs
dengan efisiensi yang lebih baik dengan melakukanfind / -xdev -type f -exec grep -H '800x600' +
.+
tanda di akhirfind
perintah sebenarnya melakukan hal yang sama sepertixargs
: ia memunculkan satugrep
proses dengan beberapa argumen.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/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. Sistem/proc
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
separatly. 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.Kecualikan area bermasalah menggunakan
--exclude-dir
dan 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:
sumber
-I
untuk mengecualikan binerUntuk kesederhanaan, saya sarankan ack-grep . Tautan menunjukkan banyak kasus ketika
ack-grep
merupakan pilihan yang lebih baik.Untuk digunakan adalah, setelah menginstal:
sumber
Cara lain untuk melihatnya adalah dengan cara ini:
sumber
* 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" /
sumber
hanya benar-
-Apa yang salah dalam perintah Anda saat ini adalah tanda kutip, "". Selalu berikan argumen string ke
grep
dalam tanda kutip.sumber
grep
. Cobalah dan Anda akan lihat. Masukkan string "800x600" dalam file dan kemudiangrep 800x600 file
dan Anda akan melihatnya berfungsi dengan baik. OP jelas memiliki masalah lain.