Bagaimana saya bisa membuat grep tidak mencetak kesalahan 'Tidak ada file atau direktori'?

215

Saya melihat-lihat setumpuk besar kode yang dikelola oleh git, dan setiap kali saya melakukan grep, saya melihat tumpukan dan tumpukan pesan dalam bentuk:

> grep pattern * -R -n
whatever/.git/svn: No such file or directory

Apakah ada cara saya bisa membuat garis itu hilang?

Alex
sumber
1
Hari ini saya sarankan menggunakan ag,, ackatau cgrepsebaliknya - mereka jauh lebih cepat / lebih baik daripada grepuntuk mencari repositori kode.
lunixbochs
Jika Anda memahami kode dan mencari untuk menghindari direktori tertentu, mungkin Anda harus melihat ack. Ini adalah grep sadar kode sumber, dan karena itu akan secara aktif mengabaikan direktori VCS tersebut (serta vi dan cadangan emacs, file non-sumber, dll.).
Brian Agnew
2
Bagaimana cara pengguna mendapatkan No such file or directorypesan untuk file dan / atau direktori yang ada? Atau, sebaliknya, bagaimana bisa grep *mendapatkan nama file yang tidak ada? Apakah ini kondisi ras, di mana beberapa proses lain memanipulasi pohon direktori (membuat, mengganti nama dan menghapus file) saat grepsedang berjalan?
Scott

Jawaban:

299

Anda dapat menggunakan -satau --no-messagesmenandai untuk menekan kesalahan.

-s, --no-pesan menekan pesan kesalahan

grep pattern * -s -R -n
Dogbert
sumber
14
@Alex @Dogbert Ini memang menjawab pertanyaan, tetapi '-s' dapat menutupi masalah, misalnya ketika Anda menggunakan xargs dengan grep. Coba buat 2 file dalam dir, 'aaa.txt' dan 'a b.txt', keduanya berisi string 'some text'. Perintah itu /bin/ls -1 | xargs grep 'some text'akan memberi Anda "tidak ada file atau direktori" karena itu memecah 'a b.txt' menjadi 2 args. Jika Anda menekan, Anda tidak akan melihat ada file yang terlewat.
Kelvin
@ Selvin tidak, misalnya jika saya menggunakan finddan menggunakan print0dengan xargs -0Apakah itu menyelesaikan masalah? Terima kasih
Luka
1
@Uka Itu harus menyelesaikan masalah. Anda tidak akan mengalami masalah jika Anda selalu menggunakan opsi NUL tersebut, tetapi jika tidak, hampir dijamin (IMHO) bahwa Anda akan lupa pada waktu yang paling tidak tepat.
Kelvin
ini berfungsi pada Mac OS X di mana opsi lain (--quiet) tidak
philshem
59

Jika Anda memahami repositori git, saya sarankan Anda menggunakannya git grep. Anda tidak perlu melewati -Ratau jalan.

git grep pattern

Itu akan menampilkan semua kecocokan dari direktori Anda saat ini ke bawah.

Steve Prentice
sumber
5
+1 untuk perintah spesifik git yang berguna. Tidak akan bekerja untuk svn :-)
cadrian
2
+1 Ini perintah git yang saya lewatkan - ini memungkinkan saya mengambil string dari status pohon di komit apa pun (dengan menambahkan komit setelah "pola").
Kelvin
1
Dengan plugin fugitive, Ggreppencarian juga dimulai dari bagian atas direktori Git, bukan direktori saat ini.
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功
Ini tampaknya jauh lebih cepat daripada grep standar. (Mungkin ini mengabaikan file biner, dll? Tidak tahu, tapi berguna.)
Daniel
10

Kesalahan seperti itu biasanya dikirim ke aliran "kesalahan standar", yang dapat Anda pipa ke file atau menghilang pada sebagian besar perintah:

grep pattern * -R -n 2>/dev/null
lunixbochs
sumber
Menjawab pertanyaan, tetapi dapat menutupi masalah. Lihat komentar saya di bawah jawaban Dogbert.
Kelvin
5

Saya telah melihat itu terjadi beberapa kali, dengan tautan rusak (symlink yang mengarah ke file yang tidak ada), grep mencoba mencari di file target, yang tidak ada (maka pesan kesalahan yang benar dan akurat).

Saya biasanya tidak repot saat melakukan tugas sysadmin pada konsol, tetapi dari dalam skrip saya mencari file teks dengan "find", dan kemudian masing-masing grep:

find /etc -type f -exec grep -nHi -e "widehat" {} \;

Dari pada:

grep -nRHi -e "widehat" /etc
Isaac Uribe
sumber
4

Saya biasanya tidak membiarkan grep melakukan rekursi itu sendiri. Biasanya ada beberapa direktori yang ingin Anda lewati (.git, .svn ...)

Anda dapat melakukan alias pintar dengan sikap seperti itu:

find . \( -name .svn -o -name .git \) -prune -o -type f -exec grep -Hn pattern {} \;

Sekilas mungkin terlihat berlebihan, tetapi ketika Anda perlu menyaring beberapa pola, ini cukup praktis.

cadrian
sumber
1
+1. Ini jauh lebih baik daripada menekan kesalahan. Namun, saya pikir Anda lupa -execsebelumnya.
Kelvin
1
Apa artinya ini? \( -name .svn -o -name .git \)
sbhatla
Mengapa tidak menggunakan flag --exclude atau --exlcude-dir grep?
Choylton B. Higginbottom
1
@sbhatla tanda kurung membuat urutan operasi untuk perintah find. stackoverflow.com/questions/24338777/…
Choylton B. Higginbottom
4

Sudahkah Anda mencoba -0opsi di xargs ? Sesuatu seperti ini:

ls -r1 | xargs -0 grep 'some text'
Cokedude
sumber
2
untuk menemukan Anda harus menambahkan -print0find -print0 | xargs -0 grep 'text'
aliva
1

Gunakan -Idi grep.

Contoh: grep SEARCH_ME -Irs ~/logs.

Bala
sumber
1
-Imelompati file biner - ini setara dengan --binary-files=without-match. Itu tidak menekan pesan "Tidak ada file atau direktori" sekalipun.
mwfearnley
0

Saya mengarahkan kembali stderrke stdoutdan kemudian menggunakan invert-match grep ( -v) untuk mengecualikan string peringatan / kesalahan yang ingin saya sembunyikan:

grep -r <pattern> * 2>&1 | grep -v "No such file or directory"
talleyho
sumber