tambahkan komentar tentang --exclude-diruntuk mengatasi kinerja dan kami memiliki seorang pemenang!
Dancrumb
1
Hanya perhatikan bahwa ini tidak portabel, tetapi greppada distro FreeBSD dan Linux terbaru mendukungnya. Dan mengapa --exclude-dir? Tidakkah Anda meminta untuk mencari seluruh pohon ?
Philippos
Titik adil ... --exclude-dirsebenarnya berguna dalam kasus penggunaan saya (karena bagian dari subtree besar, tetapi tidak berguna) dan saya memang bertanya tentang kinerja ... tetapi Anda benar, itu tidak perlu.
Dancrumb
Dalam hal ini saya harus menambahkan bahwa IIRC --exclude-direksklusif untuk GNU grep. (-:
Filipina
13
Jawaban sub optimal: Alih-alih menyalurkan output findke grep, Anda bisa menjalankan
find . -type f -exec grep 'research' {} '+'
dan voila, satu perintah, bukan dua!
penjelasan:
find . -type f
temukan semua file biasa di dalamnya.
-exec grep 'research'
grep 'penelitian'
{}
dalam nama file yang ditemukan
'+'
gunakan satu perintah per semua nama file, tidak satu kali per nama file.
Nb: dengan ';'itu akan menjadi sekali per nama file.
Selain itu, jika Anda menggunakannya untuk memproses kode sumber, Anda dapat melihat ack, yang dibuat untuk mencari bit kode dengan mudah.
Anda dapat memperluas penelitian itu sedikit. Pertama, Anda dapat menggunakan -name ''sakelar finduntuk mencari file dengan pola penamaan yang spesifik.
Contohnya :
hanya file yang terkait dengan log: -name '*.log'
hanya file yang sesuai dengan header c, tetapi Anda tidak bisa menggunakan huruf besar atau kecil untuk ekstensi nama file Anda: -iname *.c
Nb: suka untuk grepdan ack, -isakelar berarti case-sensitive dalam hal ini.
Dalam hal ini, grep akan ditampilkan tanpa warna dan tanpa nomor garis.
Anda dapat mengubah itu dengan --colordan -nswitch (masing-masing warna dan nomor baris dalam file).
Pada akhirnya, Anda dapat memiliki sesuatu seperti:
ackbesar, dan lebih cepat versi ackyaitu ag(pencari perak, geoff.greer.fm/ag )
cfeduke
1
Saya lebih suka ini dengan filter seperti -name '*.log'Ini lebih cepat.
sdkks
@cfeduke Saya belum mencobanya, sebagian besar karena ag bukan bagian dari repositori apt apt di WSL (Anda harus bekerja dengan apa yang Anda dapatkan!)
Pierre-Antoine Guillaume
Triknya adalah menambahkan / dev / null ke grep agar nama file muncul.
ChuckCottrill
Triknya adalah dengan mencari hanya direktori dan kemudian -exec grep / dev / null {} / * untuk mendapatkan semua file dengan satu garpu / exec per direktori.
ChuckCottrill
12
Jika Anda ingin rekursi menjadi subdirektori:
grep -R 'pattern' .
The -Rpilihan adalah bukan pilihan yang standar, tetapi didukung oleh paling umum grepimplementasi.
Gunakan -ralih-alih -Runtuk melewatkan symlink ketika GNU grep terkait
αғsнιη
1
@ AFSHIN Mengapa Anda tidak ingin mengikuti symlink?
Kusalananda
4
@Kusalananda Recursion? Meskipun grepimplementasi GNU saat ini menangkap rekursi, saya pikir. Kalau tidak, itu tergantung pada apa yang Anda maksud dengan "tree".
Philippos
2
@Philippos IMHO, mengasuh pengguna bukanlah sesuatu yang grepharus dilakukan oleh alat . Jika pengguna memiliki loop tautan simbolis dalam struktur direktori mereka, well, itu masalah pengguna :-)
Kusalananda
3
@ Kusalananda Dan jika sistem menyediakan loop? Tidak pernah tersesat di /sys/devices/cpu/subsystem/devices/cpu/subsystem/devices/cpu/...(-XI seperti alat menjaga saya (kecuali mereka memberikan sihir aneh yang mereka sebut "AI"). (-;
Philippos
5
Seperti disebutkan di atas -ratau -R(tergantung pada penanganan symlink yang diinginkan) adalah opsi cepat.
Namun -d <action>bisa bermanfaat sesekali.
Yang menyenangkan -dadalah perintah lewati, yang membungkam "grep: directory_name: Is a direktori" ketika Anda hanya ingin memindai level saat ini.
$ grep foo *
grep: q2: Is a directory
grep: rt: Is a directory
$ grep -d skip foo *
$
dan tentu saja:
$ grep -d recurse foo *
(list of results that don't exist because the word foo isn't in our source code
and I wouldn't publish it anyway).
$
The -d skippilihan adalah benar-benar berguna dalam script lain sehingga Anda tidak perlu 2> /dev/null. :)
Jika Anda berurusan dengan banyak file, grep berjalan lebih cepat jika Anda memangkas file yang perlu dicari alih-alih mengambil semua file dalam subfolder.
Saya terkadang menggunakan format ini:
grep "primary" `find . | grep cpp$`
Temukan semua file dalam subfolder .yang berakhir di cpp. Kemudian ambil file-file itu untuk "primer".
Jika mau, Anda dapat terus memipatkan hasil tersebut ke panggilan grep lebih lanjut:
backtics bukan praktik modern yang baik, semuanya sudah usang
Christopher
1
Ini akan rusak jika Anda memiliki file dengan karakter khusus di namanya. Saya tidak tahu betapa istimewanya mereka untuk menjadi terlalu istimewa untuk bekerja sebagaimana mestinya, tetapi apa yang Anda lakukan benar-benar sama dengan mem-parsing output ls, yang juga buruk.
Jawaban:
Periksa apakah opsi
grep
dukungan Anda-r
(untuk pengulangan ):sumber
--exclude-dir
untuk mengatasi kinerja dan kami memiliki seorang pemenang!grep
pada distro FreeBSD dan Linux terbaru mendukungnya. Dan mengapa--exclude-dir
? Tidakkah Anda meminta untuk mencari seluruh pohon ?--exclude-dir
sebenarnya berguna dalam kasus penggunaan saya (karena bagian dari subtree besar, tetapi tidak berguna) dan saya memang bertanya tentang kinerja ... tetapi Anda benar, itu tidak perlu.--exclude-dir
eksklusif untuk GNUgrep
. (-:Jawaban sub optimal: Alih-alih menyalurkan output
find
kegrep
, Anda bisa menjalankandan voila, satu perintah, bukan dua!
penjelasan:
temukan semua file biasa di dalamnya.
grep 'penelitian'
dalam nama file yang ditemukan
gunakan satu perintah per semua nama file, tidak satu kali per nama file.
Nb: dengan
';'
itu akan menjadi sekali per nama file.Selain itu, jika Anda menggunakannya untuk memproses kode sumber, Anda dapat melihat
ack
, yang dibuat untuk mencari bit kode dengan mudah.ack
Edit:
Anda dapat memperluas penelitian itu sedikit. Pertama, Anda dapat menggunakan
-name ''
sakelarfind
untuk mencari file dengan pola penamaan yang spesifik.Contohnya :
hanya file yang terkait dengan log:
-name '*.log'
hanya file yang sesuai dengan header c, tetapi Anda tidak bisa menggunakan huruf besar atau kecil untuk ekstensi nama file Anda:
-iname *.c
Nb: suka untuk
grep
danack
,-i
sakelar berarti case-sensitive dalam hal ini.Dalam hal ini, grep akan ditampilkan tanpa warna dan tanpa nomor garis.
Anda dapat mengubah itu dengan
--color
dan-n
switch (masing-masing warna dan nomor baris dalam file).Pada akhirnya, Anda dapat memiliki sesuatu seperti:
contohnya
sumber
ack
besar, dan lebih cepat versiack
yaituag
(pencari perak, geoff.greer.fm/ag )-name '*.log'
Ini lebih cepat.Jika Anda ingin rekursi menjadi subdirektori:
The
-R
pilihan adalah bukan pilihan yang standar, tetapi didukung oleh paling umumgrep
implementasi.sumber
-r
alih-alih-R
untuk melewatkan symlink ketika GNU grep terkaitgrep
implementasi GNU saat ini menangkap rekursi, saya pikir. Kalau tidak, itu tergantung pada apa yang Anda maksud dengan "tree".grep
harus dilakukan oleh alat . Jika pengguna memiliki loop tautan simbolis dalam struktur direktori mereka, well, itu masalah pengguna :-)/sys/devices/cpu/subsystem/devices/cpu/subsystem/devices/cpu/...
(-XI seperti alat menjaga saya (kecuali mereka memberikan sihir aneh yang mereka sebut "AI"). (-;Seperti disebutkan di atas
-r
atau-R
(tergantung pada penanganan symlink yang diinginkan) adalah opsi cepat.Namun
-d <action>
bisa bermanfaat sesekali.Yang menyenangkan
-d
adalah perintah lewati, yang membungkam "grep: directory_name: Is a direktori" ketika Anda hanya ingin memindai level saat ini.dan tentu saja:
The
-d skip
pilihan adalah benar-benar berguna dalam script lain sehingga Anda tidak perlu2> /dev/null
. :)sumber
Jika Anda berurusan dengan banyak file, grep berjalan lebih cepat jika Anda memangkas file yang perlu dicari alih-alih mengambil semua file dalam subfolder.
Saya terkadang menggunakan format ini:
Temukan semua file dalam subfolder
.
yang berakhir dicpp
. Kemudian ambil file-file itu untuk "primer".Jika mau, Anda dapat terus memipatkan hasil tersebut ke panggilan grep lebih lanjut:
sumber