Grep, abaikan peringatan

50

Saya mencoba mencari direktori instalasi paket tertentu. Saya memiliki kata kunci tertentu yang saya gunakan untuk mencari file tertentu.

Selama grep, saya hanya ingin memasukkan tipe file cpp atau h . Saya tidak ingin grep menampilkan peringatan seperti Izin Ditolak atau Tidak dapat menemukan Direktori . Saya hanya ingin menampilkan file yang cocok, tidak ada yang lain. Tolong sarankan bagaimana saya bisa melakukan ini?

Saat ini saya menggunakan

grep "My term" -ir --exclude-dir="\.svn" --include=*.{cpp,h} ./
Neeraj Gupta
sumber

Jawaban:

56

Peringatan-peringatan itu diarahkan ke stderrstream, berbeda dengan deskriptor file out standar. Anda dapat membungkam output stderr dengan menambahkan 2>/dev/nullke akhir perintah Anda.

James Henstridge
sumber
Lebih spesifik find . 2>/dev/null | grep 404.htmladalah seperti apa sebuah perintah
csga5000
30

Lebih langsung daripada memfilter peringatan, Anda dapat menonaktifkannya dengan menambahkan -s:

grep "My term" -sir --exclude-dir="\.svn" --include=*.{cpp,h} ./

Ada beberapa masalah kompatibilitas dengan opsi ini. Namun, ini seharusnya tidak menjadi masalah untuk penggunaan pribadi.

-s, --no-messages: Menekan pesan kesalahan tentang file yang tidak ada atau tidak dapat dibaca. Catatan portabilitas: tidak seperti GNU grep, Edisi ke-7 Unix grep tidak sesuai dengan POSIX, karena tidak memiliki -q dan opsi -snya berperilaku seperti opsi -q GNU grep. Grep gaya USG juga tidak memiliki -q tetapi opsi -snya berperilaku seperti grep GNU. Skrip shell portabel harus menghindari -q dan -s dan harus mengarahkan standar dan output kesalahan ke / dev / null. (-s ditentukan oleh POSIX.)

Sebastian vom Meer
sumber
Saya baru saja menginstal 13,04 dan saya mendapatkan kesalahan yang tidak saya dapatkan dengan 12,04. Mungkinkah ada sesuatu yang berubah? Saya pikir itu keren bahwa grep akan berhenti memperingatkan tentang file menjadi direktori karena dalam banyak kasus saya tidak peduli!
Alexis Wilke
Maaf, saya masih di 12,10, jadi saya tidak dapat mengkonfirmasi ini.
Sebastian vom Meer
5

Saya biasa mendapatkan banyak pesan yang mengganggu seperti ini:

grep: commands: Is a directory
grep: events: Is a directory
grep: views: Is a directory

Alasannya adalah bahwa --directoriesbendera default untuk read. Saya mengubahnya menjadi recurse; jika Anda tidak ingin secara otomatis melakukan pencarian rekursif Anda dapat menggunakannya skip.

Cara termudah untuk menangani ini sepanjang waktu adalah mengaturnya dalam variabel lingkungan. Di ~/.bash_profileatau ~/.bashrctergantung pada distro Anda:

export GREP_OPTIONS='--directories=recurse'

Sekarang secara otomatis menekan pesan-pesan itu setiap kali saya menggunakan grep.

Pilihan lainnya adalah --no-messagesbendera, steno -s. Ini juga akan menghilangkan Is a directorypesan, tetapi juga menekan pesan lain yang mungkin lebih berguna. Misalnya, jika Anda melakukan pencarian bersarang di */*/*dan tidak ada file dari pola itu, itu tidak akan memberitahu Anda itu.

andrewtweber
sumber
penjelasan yang
1

Pendekatan alternatif alih-alih melakukan grepsecara rekursif dengan -ir membiarkan findperintah (yang bersifat rekursif secara default) menangani izin dengan -readableflag dan path untuk dikecualikan dengan -not -path "*.svn*"flag, dan kemudian meneruskan file ke grep. Mengecualikan direktori dilakukan melalui -type funtuk menemukan hanya file biasa.

$ find . -not -path "*.svn*" -type f -name "*.cpp" -or -name "*.h"  -readable -exec grep "my terms" "{}" \; 
Sergiy Kolodyazhnyy
sumber
0

Ketika melakukan pencarian rekursif dalam file tertentu, Anda jauh lebih baik menggunakan ack-grep. Sintaksnya di sini adalah:

ack-grep -i "My term" --cpp --h

Untuk menghapus pesan kesalahan izin, Anda mungkin ingin menjalankan perintah yang sama dengan sudo:

ack-grep -i "My term" --cpp --h

Tetapi pada akhirnya, jika Anda ingin mencari paket yang diinstal, lihat berbagai opsi itu: https://www.google.com/search?q=ubuntu%20search%20inside%20installed%20packages

dargaud
sumber