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} ./

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.


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


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.



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" "{}" \; 

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

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.