Saya mencoba menemukan cara untuk memindai seluruh sistem Linux saya untuk semua file yang berisi string teks tertentu. Hanya untuk memperjelas, saya mencari teks di dalam file, bukan pada nama file.
Ketika saya mencari cara untuk melakukan ini, saya menemukan solusi ini dua kali:
find / -type f -exec grep -H 'text-to-find-here' {} \;
Namun, itu tidak berhasil. Tampaknya menampilkan setiap file dalam sistem.
Apakah ini dekat dengan cara yang tepat untuk melakukannya? Jika tidak, bagaimana seharusnya saya? Kemampuan ini untuk menemukan string teks dalam file akan sangat berguna untuk beberapa proyek pemrograman yang saya lakukan.
Lakukan hal berikut:
grep -rnw '/path/to/somewhere/' -e 'pattern'
-r
atau -R
bersifat rekursif,-n
adalah nomor baris, dan-w
adalah singkatan dari match the Word.-l
(huruf kecil L) dapat ditambahkan untuk hanya memberikan nama file dari file yang cocok.Bersamaan dengan ini, flag --exclude
, --include
, --exclude-dir
dapat digunakan untuk pencarian yang efisien:
Ini hanya akan mencari file-file yang memiliki ekstensi .c atau .h:
grep --include=\*.{c,h} -rnw '/path/to/somewhere/' -e "pattern"
Ini akan mengecualikan pencarian semua file yang diakhiri dengan ekstensi .o:
grep --exclude=*.o -rnw '/path/to/somewhere/' -e "pattern"
Untuk direktori dimungkinkan untuk mengecualikan direktori tertentu melalui parameter --exclude-dir
. Sebagai contoh, ini akan mengecualikan dirs dir1 /, dir2/dan semuanya cocok * .dst /:
grep --exclude-dir={dir1,dir2,*.dst} -rnw '/path/to/somewhere/' -e "pattern"
Ini bekerja sangat baik bagi saya, untuk mencapai tujuan yang hampir sama seperti milik Anda.
Untuk opsi lainnya, periksa man grep
.
Anda dapat menggunakan grep -ilR
:
grep -Ril "text-to-find-here" /
i
adalah singkatan dari diabaikan case (opsional dalam kasus Anda).R
singkatan dari rekursif.l
adalah singkatan dari "show the file name, bukan result yourself"./
singkatan dari mulai dari akar mesin Anda.Anda dapat menggunakan ack . Itu seperti grep untuk kode sumber. Anda dapat memindai seluruh sistem file Anda dengannya.
Kerjakan saja:
ack 'text-to-find-here'
Di direktori root Anda.
Anda juga dapat menggunakan ekspresi reguler , tentukan tipe file, dll.
PERBARUI
Saya baru saja menemukan The Silver Searcher , yang seperti ack tetapi 3-5x lebih cepat daripada itu dan bahkan mengabaikan pola dari file .gitignore
.
Kamu bisa memakai:
grep -r "string to be searched" /path/to/dir
r
adalah singkatan dari rekursif dan akan mencari di jalur yang ditentukan dan juga sub-direktori-nya. Ini akan memberi tahu Anda nama file serta mencetak baris dalam file di mana string muncul.
Atau perintah yang mirip dengan yang Anda coba (contoh:) untuk mencari di semua file javascript (* .js):
find . -name '*.js' -exec grep -i 'string to search for' {} \; -print
Ini akan mencetak baris dalam file tempat teks muncul, tetapi tidak mencetak nama file.
Selain perintah ini, kita dapat menulis ini juga: grep -rn "String to search"/path/ke/direktori/atau/file -r: pencarian rekursif n: nomor baris akan ditampilkan untuk pertandingan
Anda bisa menggunakan ini:
grep -inr "Text" folder/to/be/searched/
Pertama-tama, saya yakin Anda telah menggunakan -H
alih-alih -l
. Anda juga dapat mencoba menambahkan teks di dalam tanda kutip diikuti oleh {} \
.
find / -type f -exec grep -l "text-to-find-here" {} \;
Katakanlah Anda sedang mencari file yang mengandung teks tertentu "Lisensi Apache" di dalam direktori Anda. Ini akan menampilkan hasil yang agak mirip dengan di bawah ini (output akan berbeda berdasarkan konten direktori Anda).
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 case seperti "text" vs "TEXT", Anda dapat menggunakan -i
switch untuk mengabaikan case. Anda dapat membaca detail lebih lanjut di sini .
Semoga ini bisa membantu Anda.
grep
( GNU atau BSD )Anda dapat menggunakan alat grep
untuk mencari secara rekursif folder saat ini, seperti:
grep -r "class foo" .
Catatan: -r
- Sub direktori pencarian secara rekursif.
Anda juga dapat menggunakan sintaks globbing untuk mencari di dalam file tertentu seperti:
grep "class foo" **/*.c
Catatan: Dengan menggunakan opsi globbing (**
), ia memindai semua file secara rekursif dengan ekstensi atau pola tertentu. Untuk mengaktifkan sintaks ini, jalankan: shopt -s globstar
. Anda juga dapat menggunakan **/*.*
untuk semua file (tidak termasuk tersembunyi dan tanpa ekstensi) atau pola lainnya.
Jika Anda memiliki kesalahan karena argumen Anda terlalu panjang, pertimbangkan untuk mempersempit pencarian Anda, atau gunakan sintaks find
alih-alih seperti:
find . -name "*.php" -execdir grep -nH --color=auto foo {} ';'
Atau gunakan ripgrep
.
ripgrep
Jika Anda mengerjakan proyek yang lebih besar atau file besar, Anda harus menggunakan ripgrep
sebagai gantinya, seperti:
rg "class foo" .
Lihat dokumen, langkah-langkah instalasi atau kode sumber pada halaman proyek GitHub .
Jauh lebih cepat daripada alat lain seperti GNU / BSDgrep
, ucg
, ag
, sift
, ack
, pt
atau serupa, karena dibangun di atas mesin regex Rust yang menggunakan automata terbatas, SIMD dan optimisasi literal agresif untuk membuat pencarian sangat cepat.
Ini mendukung pola abaikan yang ditentukan dalam file .gitignore
, sehingga jalur file tunggal dapat dicocokkan dengan beberapa pola glob secara bersamaan.
Anda dapat menggunakan parameter umum seperti:
-i
- Pencarian tidak sensitif.-I
- Abaikan file biner.-w
- Cari seluruh kata (berlawanan dengan pencocokan sebagian kata).-n
- Tampilkan garis pertandingan Anda.-C
/--context
(mis. -C5
) - Meningkatkan konteks, sehingga Anda melihat kode di sekitarnya.--color=auto
- Tandai teks yang cocok.-H
- Menampilkan nama file tempat teks ditemukan.-c
- Menampilkan jumlah baris yang cocok. Dapat dikombinasikan dengan -H
.Jika grep
Anda tidak mendukung pencarian rekursif, Anda dapat menggabungkan find
dengan xargs
:
find / -type f | xargs grep 'text-to-find-here'
Saya menemukan ini lebih mudah diingat daripada format untuk find -exec
.
Ini akan menampilkan nama file dan konten dari baris yang cocok, mis.
/home/rob/file:text-to-find-here
Bendera opsional yang mungkin ingin Anda tambahkan ke grep
:
-i
- pencarian case sensitif-l
- hanya menampilkan nama file tempat kecocokan ditemukan-h
- hanya menampilkan baris yang cocok (bukan nama file)grep -insr "pattern" *
i
: Abaikan perbedaan huruf besar pada POLA dan file input.n
: Awali setiap baris output dengan nomor baris berbasis 1 di dalam file inputnya.s
: Menekan pesan kesalahan tentang file yang tidak ada atau tidak dapat dibaca.r
: Baca semua file di bawah setiap direktori, secara rekursif.Bagaimana cara menemukan semua file yang mengandung teks tertentu di Linux? (...)
Saya menemukan solusi ini dua kali:
find / -type f -exec grep -H 'text-to-find-here' {} \;
Jika menggunakanfindseperti dalam contoh Anda, lebih baik tambahkan -s
(--no-messages
) ke grep
, dan 2>/dev/null
di akhir perintah untuk menghindari banyak Izin ditolakpesan yang dikeluarkan oleh grep
dan find
:
find / -type f -exec grep -sH 'text-to-find-here' {} \; 2>/dev/null
findadalah alat standar untuk mencari file - dikombinasikan dengan grep ketika mencari teks tertentu - pada platform mirip Unix. Perintah find sering digabungkan dengan xargs , omong-omong.
Alat yang lebih cepat dan lebih mudah ada untuk tujuan yang sama - lihat di bawah. Lebih baik mencobanya, asalkan tersedia di platform Anda, tentu saja:
RipGrep- Alat pencarian tercepat di 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
ke perintah ini juga, untuk menyembunyikan banyak pesan kesalahan.
Peringatan : kecuali Anda benar-benar tidak bisa menghindarinya, jangan mencari dari '/' (direktori root) untuk menghindari pencarian yang panjang dan tidak efisien ! Jadi, dalam contoh di atas, Anda sebaiknya mengganti '/' dengan nama sub-direktori, mis. "/ Home" tergantung di mana Anda sebenarnya ingin mencari ...
Mencoba:
find . -name "*.txt" | xargs grep -i "text_pattern"
Ada utilitas baru bernama The Silversearcher
Sudo apt install silversearcher-ag
Ia bekerja erat dengan Git dan VCS lainnya. Jadi Anda tidak akan mendapatkan apa pun di .git atau direktori lain.
Anda cukup menggunakan
ag -ia "Search query"
Dan itu akan melakukan tugas untuk Anda!
Gunakan pwd
untuk mencari dari direktori mana pun Anda berada, berulang ke bawah
grep -rnw `pwd` -e "pattern"
Pembaruan Tergantung pada versi grep yang Anda gunakan, Anda dapat menghilangkan pwd
. Pada versi yang lebih baru .
tampaknya merupakan kasus default untuk grep jika tidak ada direktori yang diberikan:
grep -rnw -e "pattern"
atau
grep -rnw "pattern"
akan melakukan hal yang sama seperti di atas!
grep
dapat digunakan bahkan jika kita tidak mencari string.
Cukup berjalan,
grep -RIl "" .
akan mencetak jalur ke semua file teks, yaitu file yang hanya berisi karakter yang dapat dicetak.
Berikut adalah beberapa daftar perintah yang dapat digunakan untuk mencari 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
Sederhana dapat bekerja dengan praktis. alias di file ~/.bashrc
Anda:
alias ffind find / -type f | xargs grep
Mulai terminal baru dan terbitkan:
ffind 'text-to-find-here'
find /path -type f -exec grep -l "string" {} \;
Penjelasan dari komentar
find adalah perintah yang memungkinkan Anda menemukan file dan objek lain seperti direktori dan tautan dalam subdirektori dari jalur yang diberikan. Jika Anda tidak menentukan topeng yang harus dipenuhi oleh nama file, 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
Semoga ini bisa membantu ...
Memperluas sedikit grep
untuk memberikan lebih banyak informasi dalam output, misalnya, untuk mendapatkan nomor baris dalam file di 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 ide tentang jenis file tersebut, Anda dapat mempersempit pencarian Anda dengan menentukan ekstensi tipe file yang akan dicari, dalam hal ini file .pas
OR .dfm
:
find . -type f \( -name "*.pas" -o -name "*.dfm" \) -print0 | xargs --null grep --with-filename --line-number --no-messages --color --ignore-case "searchtext"
Penjelasan singkat tentang opsi:
.
dalam find
menentukan dari direktori saat ini.-name
"*.*
": untuk semua file (-name "*.pas
" -o -name "*.dfm
"): Hanya file *.pas
OR *.dfm
, OR ditentukan dengan -o
-type f
menentukan bahwa Anda mencari file-print0
dan --null
di sisi lain dari |
(pipa) adalah yang paling penting, meneruskan nama file dari find
ke grep
yang disematkan dalam xargs
, memungkinkan pengoperan nama file DENGAN spasi di nama file, memungkinkan grep untuk menangani path. dan nama file sebagai satu string, dan tidak memecahnya di setiap ruang.Silver Searcher adalah alat yang hebat, tetapi ripgrep mungkin lebih baik.
Ini berfungsi di Linux, Mac dan Windows, dan ditulis di Berita Hacker beberapa bulan yang lalu (ini memiliki tautan ke Blog Andrew Gallant yang memiliki tautan GitHub):
Mencoba:
find / -type f -exec grep -H 'text-to-find-here' {} \;
yang akan mencari semua sistem file, karena /
adalah folder root.
Untuk penggunaan folder rumah:
find ~/ -type f -exec grep -H 'text-to-find-here' {} \;
Untuk penggunaan folder saat ini:
find ./ -type f -exec grep -H 'text-to-find-here' {} \;
Saya menulis skrip Python yang melakukan hal serupa. Ini adalah bagaimana seseorang harus menggunakan skrip ini.
./sniff.py path pattern_to_search [file_pattern]
Argumen pertama, path
, adalah direktori di mana kita akan mencari secara rekursif. Argumen kedua, pattern_to_search
, adalah ekspresi reguler yang ingin kita cari dalam file. Kami menggunakan format ekspresi reguler yang didefinisikan di perpustakaan Pythonre
. Dalam skrip ini, .
juga cocok dengan baris baru.
Argumen ketiga, file_pattern
, adalah opsional. Ini adalah ekspresi reguler lain yang berfungsi pada nama file. Hanya file-file yang cocok dengan ekspresi reguler ini yang akan dipertimbangkan.
Misalnya, jika saya ingin mencari file Python dengan ekstensi py
berisi Pool(
diikuti oleh Word Adaptor
, saya melakukan hal berikut,
./sniff.py . "Pool(.*?Adaptor" .*py
./Demos/snippets/cubeMeshSigNeur.py:146
./Demos/snippets/testSigNeur.py:259
./python/moose/multiscale/core/mumbl.py:206
./Demos/snippets/multiComptSigNeur.py:268
Dan voila, ini menghasilkan jalur file yang cocok dan nomor baris di mana pertandingan ditemukan. Jika lebih dari satu kecocokan ditemukan, maka setiap nomor baris akan ditambahkan ke nama file.
Menggunakan:
grep -c Your_Pattern *
Ini akan melaporkan berapa banyak salinan pola Anda ada di setiap file di direktori saat ini.
grep adalah teman baik Anda untuk mencapai ini.
grep -r <text_fo_find> <directory>
jika Anda tidak peduli dengan teks yang akan ditemukan, gunakan
grep -ir <text_to_find> <directory>
Semua jawaban sebelumnya menyarankan grep dan temukan. Tetapi ada cara lain: Gunakan Midnight Commander
Ini adalah utilitas gratis (30 tahun, dibuktikan oleh waktu) yang visual tanpa GUI. Ini memiliki banyak fungsi, dan menemukan file hanyalah salah satunya.
Untuk mencari string dan output sesuai dengan string pencarian:
for i in $(find /path/of/target/directory -type f); do grep -i "the string to look for" "$i"; done
misalnya.:
for i in $(find /usr/share/applications -type f); \
do grep -i "web browser" "$i"; done
Untuk menampilkan nama file yang berisi string pencarian:
for i in $(find /path/of/target/directory -type f); do if grep -i "the string to look for" "$i" > /dev/null; then echo "$i"; fi; done;
misalnya.:
for i in $(find /usr/share/applications -type f); \
do if grep -i "web browser" "$i" > /dev/null; then echo "$i"; \
fi; done;
Ada alat ack
yang akan melakukan apa yang Anda cari.
http://linux.die.net/man/1/ack
ack -i search_string folder_path/*
Anda dapat mengabaikan -i
untuk pencarian case sensitif
Perintah di bawah ini akan berfungsi dengan baik untuk pendekatan ini:
find ./ -name "file_pattern_name" -exec grep -r "pattern" {} \;
Coba ini:
find . | xargs grep 'Word' -sl
Saya terpesona dengan betapa sederhananya grep membuatnya dengan 'rl'
grep -rl 'pattern_to_find' /path/where/to/find
-r to find recursively file / directory inside directories..
-l to list files matching the 'pattern'
Gunakan '-r' tanpa 'l' untuk melihat nama file diikuti oleh teks di mana pola ditemukan !
grep -r 'pattern_to_find' /path/where/to/find
Bekerja dengan sempurna ..
Semoga ini bisa membantu!
Anda dapat menggunakan perintah di bawah ini karena Anda tidak ingin nama file tetapi Anda ingin mencari dari semua file. Inilah saya mengambil formulir "TEXT" Semua file log memastikan bahwa nama file tidak dicetak
grep -e TEXT *.log | cut -d' ' --complement -s -f1
grep dengan opsi -e cukup cepat dibandingkan dengan opsi lain seperti untuk pertandingan POLA
Hindari kerepotan dan instal ack-grep. Ini menghilangkan banyak masalah izin dan kutipan.
apt-get install ack-grep
Lalu pergi ke direktori yang ingin Anda cari dan jalankan perintah di bawah ini
cd /
ack-grep "find my keyword"
Jika Anda benar-benar ingin menggunakan find
maka:
find /path/to/somewhere/ -type f -exec grep -nw 'textPattern' {} \;
find + grep
1.Gunakan find
untuk mencari file, 2.Kemudian jalankan grep
pada semuanya.
Dapat digabungkan dalam satu perintah seperti di bawah ini:
find /path/to/somewhere/ -type f -exec grep -nw 'textPattern' {} \;
Gunakan -name Pattern
jika Anda ingin grep
hanya file-file tertentu:
find /path/to/somewhere/ -type f -name \*.cpp -exec grep -nw 'textPattern' {} \;
Ini dapat memberi Anda kekuatan find
untuk menemukan file. Anda dapat bermain dengannya dan menggunakan berbagai opsi find
untuk meningkatkan atau mempersempit pencarian file Anda.
find
name__s dengan xarg
name__s lebih disukai ketika ada banyak pencocokan potensial untuk disaring. Ini berjalan lebih lambat dari opsi lain, tetapi selalu berhasil. Seperti yang ditemukan beberapa orang, xargs
tidak menangani file dengan ruang yang disematkan secara default. Anda dapat mengatasinya dengan menentukan opsi -d
.
Inilah jawaban @ RobEarl, disempurnakan sehingga menangani file dengan spasi:
find / -type f | xargs -d '\n' grep 'text-to-find-here'
Berikut adalah jawaban @ venkat, yang juga ditingkatkan:
find . -name "*.txt" | xargs -d '\n' grep -i "text_pattern"
Inilah jawaban @Gert van Biljon, yang sama-sama ditingkatkan:
find . -type f -name "*.*" -print0 | xargs -d '\n' --null grep --with-filename --line-number --no-messages --color --ignore-case "searthtext"
Inilah jawaban @ LetalProgrammer, yang sama-sama ditingkatkan:
alias ffind find / -type f | xargs -d '\n' grep
Inilah jawaban @Tayab Hussain, yang juga ditingkatkan:
find . | xargs -d '\n' grep 'Word' -sl
Jika Anda memiliki serangkaian file yang akan selalu Anda periksa, Anda dapat alias pathnya, misalnya:
alias fd='find . -type f -regex ".*\.\(inc\|info\|module\|php\|test\|install\|uninstall\)"'
Maka Anda dapat dengan mudah menyaring daftar seperti ini:
grep -U -l $'\015' $(fd)
Yang memfilter daftar fd ke file yang berisi pola CR.
Saya menemukan bahwa aliasing file yang saya minati membantu saya membuat skrip yang lebih mudah maka selalu berusaha mengingat bagaimana mendapatkan semua file tersebut. Hal-hal rekursif juga berfungsi, tetapi cepat atau lambat Anda harus bersaing dengan menyapu jenis file tertentu. Itulah sebabnya saya baru saja menemukan semua jenis file yang saya tertarik untuk memulai.
Coba ini:
find / -type f -name "*" -exec grep -il "String_to_search" {} \;
Atau
for i in /*;do grep -Ril "String_to_search" $i;done 2> /dev/null
Menggunakan:
grep -Erni + "text you wanna search"
Perintah akan mencari secara rekursif di semua file dan direktori direktori saat ini dan mencetak hasilnya.
Catatan: jika output grep Anda tidak berwarna, Anda dapat mengubahnya dengan menggunakan alias grep = 'grep --color = always' di file sumber Shell Anda.
Anda dapat menggunakan perintah berikut untuk menemukan teks tertentu dari file:
cat file | grep 'abc' | cut -d':' -f2
Seperti Peter dalam jawaban sebelumnya yang disebutkan , semua jawaban sebelumnya menyarankan grep dan temukan.
Tetapi ada cara yang lebih canggih menggunakan Gnome Commander dengan sempurnaGUIdan dengan banyak pilihan sejak 2001, dan menemukan file hanyalah salah satunya. Ini adalah utilitas gratis juga, dibuktikan oleh waktu.
Coba ini
find . -type f -name some_file_name.xml -exec grep -H PUT_YOUR_STRING_HERE {} \;
Alternatif Pencarian GUI - Untuk Penggunaan Desktop:
- Karena pertanyaannya tidak tepat meminta perintah
Searchmonkey : Alat pencarian file lanjutan tanpa harus mengindeks sistem Anda menggunakan ekspresi reguler. Setara grafis dengan find/grep. Tersedia untuk Linux (Gnome/KDE/Java) dan Windows (Java) - open source GPL v3
Fitur:
Unduh - Tautan:
.
Tangkapan layar:
perintahmu benar. Hanya perlu menambahkan -l ke grep.
find / -type f -exec grep -l 'text-to-find-here' {} \;