I'm mencoba untuk menemukan cara untuk memindai seluruh sistem Linux untuk semua file yang berisi string tertentu dari teks. Hanya untuk memperjelas, saya'm mencari teks dalam file, tidak dalam nama file.
Ketika saya sedang mencari cara untuk melakukan hal ini, saya menemukan solusi ini dua kali:
find / -type f -exec grep -H 'text-to-find-here' {} \;
Namun, itu doesn't bekerja. Tampaknya untuk menampilkan setiap file dalam sistem.
Ini dekat dengan cara yang tepat untuk melakukannya? Jika tidak, bagaimana saya harus? Kemampuan ini untuk mencari string teks dalam file yang akan sangat berguna untuk beberapa proyek pemrograman I'm lakukan.
Lakukan hal berikut:
grep -rnw '/path/to/somewhere/' -e 'pattern'
-r
atau -R
adalah rekursif, -n
adalah nomor baris, dan -w
singkatan cocok dengan seluruh kata. -l
(huruf L) dapat ditambahkan untuk memberikan nama file dari file yang cocok.Seiring dengan ini, --mengecualikan
, --termasuk
, --exclude-dir
bendera dapat digunakan untuk efisien mencari:
grep --termasuk=*.{c,h} -rnw '/path/ke/tempat/' -e "pola"
grep --exclude=*.o -rnw '/path/ke/tempat/' -e "pola"
--exclude-dir
parameter. Misalnya, ini akan mengecualikan dirs dir1/, dir2/ dan semua dari mereka yang cocok *.dst/:grep --exclude-dir={dir1,dir2,*.dst} -rnw '/path/ke/tempat/' -e "pola"
Ini bekerja sangat baik bagi saya, untuk mencapai hampir tujuan yang sama seperti milik anda.
Untuk lebih banyak pilihan check man grep
.
Anda dapat menggunakan grep -ilR
:
grep -Ril "text-to-find-here" /
aku
berdiri untuk mengabaikan kasus (opsional dalam kasus anda). R
merupakan singkatan rekursif. l
merupakan singkatan dari "menampilkan nama file, bukan hasil sendiri"./
singkatan dari mulai root dari mesin anda.Anda dapat menggunakan ack. Hal ini seperti grep untuk kode sumber. Anda dapat memindai seluruh sistem berkas dengan itu.
Hanya lakukan:
ack 'text-to-find-here'
Di direktori root anda.
Anda juga dapat menggunakan ekspresi reguler, tentukan tipe data, dll.
UPDATE
Saya baru saja menemukan Perak Searcher, yang seperti ack tapi 3-5x lebih cepat dari itu dan bahkan mengabaikan pola dari .gitignore
file.
Anda dapat menggunakan:
grep -r "string to be searched" /path/to/dir
R
merupakan singkatan rekursif dan akan mencari di jalur yang ditentukan dan juga sub-direktori. Ini akan memberitahu anda nama file serta print out line di file mana string muncul.
Atau perintah yang mirip dengan salah satu yang anda mencoba (contoh: ) untuk mencari di semua file javascript (*.js):
find . -name '*.js' -exec grep -i 'string to search for' {} \; -print
Ini akan mencetak satu baris di file mana teks yang muncul, tapi hal itu tidak mencetak nama file.
Selain perintah ini, kita dapat menulis ini juga: grep -rn "String untuk pencarian" /path/ke/direktori/atau/file -r: pencarian rekursif n: nomor baris yang akan ditampilkan selama pertandingan
Pertama-tama, saya percaya anda telah menggunakan -H
bukan -l
. Anda juga dapat mencoba menambahkan teks di dalam tanda kutip diikuti oleh {} \
.
find / -type f -exec grep -l "text-to-find-here" {} \;
Let's mengatakan anda mencari untuk file yang berisi teks tertentu "Lisensi Apache" di dalam direktori anda. Ini akan menampilkan hasil yang agak mirip dengan di bawah ini (output akan berbeda berdasarkan isi direktori).
bash-4.1$ find . -type f -exec grep -l "Apache License" {} \;
./net/java/jvnet-parent/5/jvnet-parent-5.pom
./commons-cli/commons-cli/1.3.1/commons-cli-1.3.1.pom
./io/swagger/swagger-project/1.5.10/swagger-project-1.5.10.pom
./io/netty/netty-transport/4.1.7.Final/netty-transport-4.1.7.Final.pom
./commons-codec/commons-codec/1.9/commons-codec-1.9.pom
./commons-io/commons-io/2.4/commons-io-2.4.pom
bash-4.1$
Bahkan jika anda tidak menggunakan tentang kasus seperti "text" lebih "TEXT", anda dapat menggunakan aku
switch untuk mengabaikan kasus ini. Anda dapat membaca rincian lebih lanjut di sini.
Semoga ini bisa membantu anda.
grep
(uji coba atau BSD)Anda dapat menggunakan grep
alat untuk pencarian rekursif folder saat ini, seperti:
grep -r "class foo" .
Catatan: -r
- Rekursif pencarian subdirektori.
Anda juga dapat menggunakan globbing sintaks untuk mencari di dalam file tertentu seperti:
grep "class foo" **/*.c
Catatan: Dengan menggunakan globbing pilihan (**
), scan semua file secara rekursif dengan ekstensi tertentu atau pola. Untuk mengaktifkan sintaks ini, jalankan: shopt -s globstar
. Anda juga dapat menggunakan **/*.*
untuk semua file (termasuk yang tersembunyi dan tanpa ekstensi) atau pola lainnya.
Jika anda've kesalahan bahwa argumen anda terlalu panjang, pertimbangkan untuk mempersempit pencarian anda, atau menggunakan menemukan
sintaks bukannya seperti:
find . -name "*.php" -execdir grep -nH --color=auto foo {} ';'
Atau gunakan ripgrep
.
ripgrep
Jika anda're bekerja pada proyek yang lebih besar atau big file, anda harus menggunakan ripgrep
bukan, seperti:
rg "class foo" .
Pelajari dokumen, langkah-langkah instalasi atau kode sumber di halaman proyek GitHub.
It's jauh lebih cepat daripada alat lainnya seperti uji coba/BSD grep
, ucg
, ag
, menyaring
, ack
, pt
atau serupa, karena dibangun di atas Karat's regex engine yang menggunakan finite automata, SIMD dan agresif literal optimasi untuk membuat pencarian sangat cepat.
Mendukung mengabaikan pola yang ditentukan dalam .gitignore
file, sehingga file tunggal jalan dapat dicocokkan terhadap beberapa pola glob secara bersamaan.
Anda dapat menggunakan parameter yang umum seperti:
aku
- Sensitive mencari.Aku
- Mengabaikan file biner.-w
- Mencari seluruh kata-kata (secara berlawanan dari sebagian kata-kata yang cocok).-n
- Tampilkan garis pertandingan.-C
/--
konteks (misalnya -C5
) - Meningkatkan konteks, sehingga anda melihat kode sekitarnya .--warna=auto
- Mark up pencocokan teks.-H
- Menampilkan nama file mana teks yang ditemukan.-c
- Menampilkan hitungan sesuai garis. Dapat dikombinasikan dengan -H
.Jika anda grep
doesn't mendukung pencarian rekursif, anda dapat menggabungkan menemukan
dengan xargs
:
find / -type f | xargs grep 'text-to-find-here'
Saya menemukan ini lebih mudah untuk diingat daripada format untuk cari -exec
.
Ini akan menampilkan nama file dan isi sesuai garis, misalnya
/home/rob/file:text-to-find-here
Optional flags anda mungkin ingin menambah grep
:
-i
- kasus sensitif cari-l
- hanya output filename di mana pertandingan itu ditemukan-h
- hanya menampilkan baris yang sesuai (bukan nama file)grep -insr "pattern" *
i
: Mengabaikan perbedaan pada kedua POLA dan file input.n
: Prefix setiap baris output dengan 1-berdasarkan nomor baris dalam file input.s
: Menekan pesan kesalahan tentang ada atau tidak terbaca file.r
: Membaca semua file di bawah masing-masing direktori secara rekursif.Bagaimana saya menemukan semua file yang berisi teks tertentu di Linux? (...)
saya menemukan solusi ini dua kali:
find / -type f -exec grep -H 'text-untuk-menemukan-berikut' {} \;
Jika menggunakan cari seperti dalam contoh anda, lebih baik menambahkan -s
(--tanpa-pesan
) untuk grep
, dan 2>/dev/null
di akhir perintah untuk menghindari banyak Izin ditolak pesan yang dikeluarkan oleh grep
dan menemukan
:
find / -type f -exec grep -sH 'text-to-find-here' {} \; 2>/dev/null
cari adalah alat standar untuk mencari file - dikombinasikan dengan grep ketika mencari teks tertentu - pada platform seperti Unix. Tombol cari perintah ini sering dikombinasikan dengan xargs, by the way.
Lebih cepat dan lebih mudah alat-alat yang ada untuk tujuan yang sama seperti di bawah ini. Lebih baik mencoba mereka, disediakan mereka're tersedia pada platform, tentu saja:
RipGrep - alat pencarian tercepat sekitar:
rg 'text-to-find-here' / -l
ag 'text-to-find-here' / -l
ack:
ack 'text-to-find-here' / -l
Catatan: Anda dapat menambahkan 2>/dev/null
untuk perintah ini juga, untuk menyembunyikan banyak pesan kesalahan.
Peringatan: kecuali jika anda benar-benar dapat't menghindari hal itu, don't pencarian dari '/' (direktori root) untuk menghindari lama dan tidak efisien pencarian! Jadi pada contoh di atas, anda'd ganti yang lebih baik '/' oleh sub-direktori nama, misalnya " rumah" tergantung di mana anda benar-benar ingin mencari...
Ada's utilitas baru yang disebut Yang Silversearcher
sudo apt install silversearcher-ag
Ia bekerja sama dengan Git dan lain VCS. Sehingga anda tidak't mendapatkan apa-apa dalam .git atau direktori lain.
Anda hanya dapat menggunakan
ag "Search query"
Dan itu akan melakukan tugas untuk anda!
Gunakan pwd
untuk pencarian dari direktori manapun anda berada, recursing ke bawah
grep -rnw `pwd` -e "pattern"
Update
Tergantung pada versi grep anda gunakan, anda dapat menghilangkan pwd
. Pada versi yang lebih baru .
tampaknya menjadi kasus default untuk grep jika direktori tidak diberikan
dengan demikian:
grep -rnw -e "pola"
atau
grep -rnw "pola"
akan melakukan hal yang sama seperti di atas!
Berikut ini adalah beberapa daftar perintah yang dapat digunakan untuk pencarian file.
grep "text string to search” directory-path
grep [option] "text string to search” directory-path
grep -r "text string to search” directory-path
grep -r -H "text string to search” directory-path
egrep -R "word-1|word-2” directory-path
egrep -w -R "word-1|word-2” directory-path
find /path -type f -exec grep -l "string" {} \;
Penjelasan dari komentar
menemukan adalah perintah yang memungkinkan anda menemukan file dan benda-benda lain seperti direktori dan link dalam subdirektori dari jalan yang diberikan. Jika anda don't menentukan masker yang filesnames harus bertemu, itu menyebutkan semua objek direktori.
-type f specifies that it should proceed only files, not directories etc.
-exec grep specifies that for every found file, it should run grep command, passing its filename as an argument to it, by replacing {} with the filename
Perak Pencari adalah alat yang hebat, tapi ripgrep mungkin bahkan lebih baik.
Ia bekerja pada Linux, Mac dan Windows, dan ditulis pada Hacker News beberapa bulan yang lalu (ini memiliki link ke Andrew Gagah's Blog yang memiliki link GitHub):
Coba:
find / -type f -exec grep -H 'text-to-find-here' {} \;
yang akan mencari semua file sistem, karena /
adalah folder root.
Untuk folder rumah menggunakan:
find ~/ -type f -exec grep -H 'text-to-find-here' {} \;
Untuk saat ini folder menggunakan:
find ./ -type f -exec grep -H 'text-to-find-here' {} \;
Berharap ini adalah bantuan...
Memperluas grep
sedikit untuk memberikan informasi lebih lanjut dalam output, misalnya, untuk mendapatkan jumlah baris dalam file mana teks dapat dilakukan sebagai berikut:
find . -type f -name "*.*" -print0 | xargs --null grep --with-filename --line-number --no-messages --color --ignore-case "searthtext"
Dan jika anda memiliki gagasan tentang apa jenis file ini anda dapat mempersempit pencarian anda dengan menentukan jenis file ekstensi untuk mencari, dalam hal ini .pas
ATAU `.dfm file:
find . -type f \( -name "*.pas" -o -name "*.dfm" \) -print0 | xargs --null grep --with-filename --line-number --no-messages --color --ignore-case "searchtext"
Penjelasan singkat dari pilihan:
.
di menemukan
menentukan dari direktori saat ini.nama
"*.*
" : untuk semua file
( -nama "*.pas
" -o -nama "*.dfm
" ) : Hanya *.pas
ATAU *.dfm file, ATAU ditentukan dengan
-o `-type f
menentukan bahwa anda sedang mencari file-print0
dan --null
di sisi lain |
(pipa) yang penting orang-orang, lewat nama file dari menemukan
ke grep
tertanam dalam xargs
, yang memungkinkan untuk lewat dari nama file DENGAN spasi pada nama file, yang memungkinkan grep untuk mengobati jalur dan nama file sebagai string, dan tidak istirahat itu pada masing-masing ruang.