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?
ag
,,ack
ataucgrep
sebaliknya - mereka jauh lebih cepat / lebih baik daripadagrep
untuk mencari repositori kode.No such file or directory
pesan untuk file dan / atau direktori yang ada? Atau, sebaliknya, bagaimana bisagrep *
mendapatkan nama file yang tidak ada? Apakah ini kondisi ras, di mana beberapa proses lain memanipulasi pohon direktori (membuat, mengganti nama dan menghapus file) saatgrep
sedang berjalan?Jawaban:
Anda dapat menggunakan
-s
atau--no-messages
menandai untuk menekan kesalahan.sumber
/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.find
dan menggunakanprint0
denganxargs -0
Apakah itu menyelesaikan masalah? Terima kasihJika Anda memahami repositori git, saya sarankan Anda menggunakannya
git grep
. Anda tidak perlu melewati-R
atau jalan.Itu akan menampilkan semua kecocokan dari direktori Anda saat ini ke bawah.
sumber
Ggrep
pencarian juga dimulai dari bagian atas direktori Git, bukan direktori saat ini.Kesalahan seperti itu biasanya dikirim ke aliran "kesalahan standar", yang dapat Anda pipa ke file atau menghilang pada sebagian besar perintah:
sumber
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:
Dari pada:
sumber
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:
Sekilas mungkin terlihat berlebihan, tetapi ketika Anda perlu menyaring beberapa pola, ini cukup praktis.
sumber
-exec
sebelumnya.\( -name .svn -o -name .git \)
Sudahkah Anda mencoba
-0
opsi di xargs ? Sesuatu seperti ini:sumber
find -print0 | xargs -0 grep 'text'
Gunakan
-I
di grep.Contoh:
grep SEARCH_ME -Irs ~/logs
.sumber
-I
melompati file biner - ini setara dengan--binary-files=without-match
. Itu tidak menekan pesan "Tidak ada file atau direktori" sekalipun.Saya mengarahkan kembali
stderr
kestdout
dan kemudian menggunakan invert-match grep (-v
) untuk mengecualikan string peringatan / kesalahan yang ingin saya sembunyikan:sumber