it-swarm-id.com

Bagaimana cara menemukan semua file yang mengandung teks tertentu di Linux?

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.

4457
Nathan

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.

8076
rakib_

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.
1279
fedorqui

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.

283
EarlOfEgo

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

156
learner_19

Anda bisa menggunakan ini:

grep -inr "Text" folder/to/be/searched/
99
A R

Daftar nama file yang mengandung teks yang diberikan

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" {} \; 

Contoh

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$ 

Hapus sensitivitas huruf

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.

59
lkamal

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.
52
kenorb

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)
51
RobEarl
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.
38
enfinet

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:

Alternatif yang lebih cepat dan mudah

RipGrep- Alat pencarian tercepat di sekitar:

rg 'text-to-find-here' / -l

Pencari Perak:

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 ...

29
Bludzee

Mencoba:

find . -name "*.txt" | xargs grep -i "text_pattern"
27
venkat

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!

27
Neil Agarwal

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!

26
mahatmanich

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.

18
Alex Jasmin

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
16
Atul Arvind

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'
14
danglingpointer
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
14
Vinod Joshi

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:

  1. . dalam find menentukan dari direktori saat ini.
  2. -name "*.*": untuk semua file (-name "*.pas" -o -name "*.dfm"): Hanya file *.pas OR *.dfm, OR ditentukan dengan -o
  3. -type f menentukan bahwa Anda mencari file
  4. -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.
14
Gert van Biljon

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):

Ripgrep - Alat pencarian baris perintah baru

14
AAAfarmclub

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' {} \;
14
user4863663

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.

13
Dilawar

Menggunakan:

grep -c Your_Pattern *

Ini akan melaporkan berapa banyak salinan pola Anda ada di setiap file di direktori saat ini.

12
Dr_Hope

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>
11
Prash

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.

11
Peter M.

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;
11
user3124504

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

11
Pal

Perintah di bawah ini akan berfungsi dengan baik untuk pendekatan ini:

find ./ -name "file_pattern_name"  -exec grep -r "pattern" {} \;
10
Pradeep Goswami

Coba ini:

find . | xargs grep 'Word' -sl
10
Tayab Hussain

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!

10
nitinr708

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

10
Mitul Patel

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"
10
Kareem

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.

8
BreakBadSP

findname__s dengan xargname__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, xargstidak 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
7
Mike Slinn

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.

7
dkinzer

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
7
VIPIN KUMAR

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.

7
baldash

Anda dapat menggunakan perintah berikut untuk menemukan teks tertentu dari file:

cat file | grep 'abc' | cut -d':' -f2
7
iamjayp

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.

7
Geeocode

Coba ini

find . -type f -name some_file_name.xml -exec grep -H PUT_YOUR_STRING_HERE {} \;
6

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:

  • Ekspresi Reguler Lanjutan
  • Hasil ditampilkan dalam konteks
  • Cari yang mengandung teks
  • Panel untuk menampilkan baris yang berisi teks
  • Pembaruan 2018 baru
  • dll.

Unduh - Tautan:

.

Tangkapan layar:

 Enter image description here 

5
intika

perintahmu benar. Hanya perlu menambahkan -l ke grep.

find / -type f -exec grep -l 'text-to-find-here' {} \;
0
FariZ