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

5259

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

Nathan
sumber
21
ingat bahwa grep akan menafsirkan apapun .sebagai wildcard satu karakter, antara lain. Saran saya adalah selalu gunakan fgrep atau egrep.
Walter Tross
10
Lagi pula, Anda hampir sampai! Ganti saja -Hdengan -l(dan mungkin grepdengan fgrep). Untuk mengecualikan file dengan pola nama tertentu yang akan Anda gunakan finddengan cara yang lebih maju. findMeskipun demikian, ada baiknya belajar menggunakan . Adil man find.
Walter Tross
6
find … -exec <cmd> +lebih mudah untuk mengetik dan lebih cepat daripada find … -exec <cmd> \;. Ini hanya berfungsi jika <cmd>menerima sejumlah argumen nama file. Penghematan waktu eksekusi sangat besar jika <cmd>lambat untuk memulai seperti skrip Python atau Ruby.
hagello
Untuk mencari secara non-rekursif dalam path yang diberikan perintahnya adalah `grep --include = *. Txt -snw" pattern "thepath / *.
Stéphane Laurent
@ StéphaneLaurent Saya pikir Anda terlalu menyulitkan. Katakan sajagrep "pattern" path/*.txt
fedorqui 'SO berhenti merugikan'

Jawaban:

9523

Lakukan hal berikut:

grep -rnw '/path/to/somewhere/' -e 'pattern'
  • -ratau -Rrekursif,
  • -n adalah nomor baris, dan
  • -w singkatan cocok dengan seluruh kata.
  • -l (huruf kecil L) dapat ditambahkan untuk hanya memberikan nama file dari file yang cocok.

Seiring dengan ini, --exclude, --include, --exclude-dirbendera dapat digunakan untuk pencarian 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 --exclude-dirparameter. 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.

rakib_
sumber
74
gunakan --exclude. seperti "grep -rnw --exclude = *. o 'direktori' -e" pattern "
rakib_
98
perlu dicatat: sepertinya rpilihannya adalah malas (melintasi kedalaman-pertama, daripada berhenti setelah direktori pertama), sementara Ritu rakus (akan melintasi seluruh pohon dengan benar).
Eliran Malka
5
grep -rnw "String yang saya cari" melakukan apa yang saya butuhkan. Terima kasih!
ViliusK
33
Catatan (terutama untuk pemula): Tanda kutip pada perintah di atas penting.
madD7
69
@ Eliran Malka Ren rakan melintasi direktori dengan benar, tetapi Rakan mengikuti tautan simbolik.
bzeaman
1499

Anda bisa menggunakan grep -ilR:

grep -Ril "text-to-find-here" /
  • i berdiri untuk kasus abaikan (opsional dalam kasus Anda).
  • R singkatan dari rekursif.
  • l singkatan dari "tampilkan nama file, bukan hasil itu sendiri".
  • / singkatan mulai dari akar mesin Anda.
fedorqui 'SO berhenti merugikan'
sumber
85
Berdasarkan pengalaman saya, ini -imembuatnya sangat lambat, jadi jangan menggunakannya jika tidak perlu. Uji dalam dir tertentu dan kemudian generalisasi. Itu harus diselesaikan dalam beberapa menit. Saya pikir ekspresi reguler akan membuatnya lebih lambat. Tetapi komentar saya didasarkan pada anggapan, saya sarankan Anda untuk mengujinya timedi depan baris.
fedorqui 'SO berhenti merugikan'
4
Ya, /*singkatan dari itu. Pokoknya saya baru mengujinya dan memperhatikan bahwa itu hanya /berfungsi.
fedorqui 'SO berhenti merugikan'
10
Jika Anda tidak mencari menggunakan regex Anda dapat menggunakan fgrep sebagai ganti grep pada kebanyakan sistem.
markle976
8
Ya @ markle976, sebenarnya dari manusia grep: fgrep is the same as grep -F -> Interpret PATTERN as a list of fixed strings.
fedorqui 'SO stop harming'
17
Anda dapat mengganti / dengan jalur ke direktori grep -Ril "text-to-find-here" ~/sites/atau menggunakan. untuk direktori saat inigrep -Ril "text-to-find-here" .
Hitam
329

Anda bisa menggunakan ack . Ini 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 , menentukan tipe file, dll.


MEMPERBARUI

Saya baru saja menemukan The Silver Searcher , yang seperti ack tetapi 3-5x lebih cepat daripada itu dan bahkan mengabaikan pola dari suatu .gitignorefile.

Stephan
sumber
57
Sangat bermanfaat, sederhana dan cepat. Peringatan: "Pada distro yang diturunkan dari Debian, ack dikemas sebagai" ack-grep "karena" ack "sudah ada" (dari beyondgrep.com/install ). Anda mungkin menjalankan konverter kode Kanji di Linux itu ...
Jose_GD
11
ack atau ack-grep memiliki highlight yang bagus, tetapi temukan + grep ketika penggunaan yang tepat jauh lebih baik dalam kinerjanya
Sławomir Lenart
14
Perhatikan bahwa ripgrep lebih cepat daripada apa pun yang disebutkan di sini, termasuk The Silver Searcher dan plain 'ol grep. Lihat posting blog ini sebagai bukti.
Radon Rosborough
194

Kamu bisa menggunakan:

grep -r "string to be searched"  /path/to/dir

The rsingkatan rekursif dan akan mencari di jalan 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-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

pelajar_19
sumber
1
Terima kasih untuk versi find. Versi grep saya (busybox untuk NAS) tidak memiliki opsi -r, saya benar-benar membutuhkan solusi lain!
jc
3
Terima kasih untuk versi 'temukan'! Sangat penting untuk dapat memfilter dengan ' .js' atau ' .txt', dll. Tidak ada yang ingin menghabiskan berjam-jam menunggu grep untuk menyelesaikan pencarian semua video multi-gigabyte dari liburan keluarga terakhir, bahkan jika perintahnya adalah lebih mudah mengetik.
mayypile
grep lebih baik daripada versi yang diterima, karena diterima jangan mencari setengah kata
waza123
114

Anda bisa menggunakan ini:

grep -inr "Text" folder/to/be/searched/
AR
sumber
12
termudah, verbose, rekursif dan case-sensitive. jempolan.
Francesco Casula
jika Anda menambahkan -A3 bahkan lebih baik
albanx
73

Daftar nama file yang mengandung teks yang diberikan

Pertama-tama, saya percaya Anda telah menggunakan -Hbukan -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 -isakelar untuk mengabaikan case. Anda dapat membaca detail lebih lanjut di sini .

Semoga ini bisa membantu Anda.

lkamal
sumber
2
Apa yang dilakukan perintah ini: findakan melewati semua jalur yang ditemukannya ke perintah grep -l "text-to-find-here" <file found>". Anda dapat menambahkan batasan pada nama file, mis. find / -iname "*.txt"Untuk mencari hanya di file yang namanya berakhir.txt
Mene
1
@ Auxiliary - termasuk contoh output untuk menghindari kebingungan bagi pembaca.
lkamal
2
@Mene Sungguh menyedihkan bahwa komentar Auxiliary memiliki lebih banyak suara daripada Anda ... bahkan jika komentar mereka dari 2014 dan komentar Anda pada 2017 bahwa komentar mereka memiliki 6 ketika seharusnya tepat 0 dan Anda hanya memiliki satu (sekarang dua) tidak sesuatu yang ingin saya percayai.
Pryftan
@Mene Yang dikatakan -inamecase-insensitive yang berarti juga akan menemukan file .TXT, misalnya, serta TxT dan TXt dan sebagainya.
Pryftan
66

grep( GNU atau BSD )

Anda dapat menggunakan grepalat untuk mencari folder saat ini secara rekursif, 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 findsintaksis 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 menggunakannya ripgrep, seperti:

rg "class foo" .

Lihat dokumen, langkah-langkah instalasi atau kode sumber pada halaman proyek GitHub .

Ini jauh lebih cepat daripada alat lain seperti GNU / BSD grep , ucg, ag, sift, ack, ptatau serupa, karena dibangun di atas mesin regex Rust ini yang menggunakan automata terbatas, SIMD dan optimasi literal agresif untuk membuat pencarian sangat cepat.

Ini mendukung pola abaikan yang ditentukan dalam .gitignorefile, 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(eg -C5) - Meningkatkan konteks, sehingga Anda melihat kode di sekitarnya.
  • --color=auto - Tandai teks yang cocok.
  • -H - Menampilkan nama file tempat teks ditemukan.
  • -c- Menampilkan hitungan garis yang cocok. Dapat dikombinasikan dengan -H.
kenorb
sumber
1
Saya juga menemukan globbing diperpanjang berguna. Tetapi perlu diingat bahwa jika ada jumlah file yang sangat besar, Anda bisa mendapatkan kesalahan "Daftar argumen terlalu panjang". (Penggumpalan sederhana juga rentan terhadap kesalahan semacam ini).
Yoory N.
2
Untuk menghirup seluruh sistem file, rg akan jauh lebih tidak menyakitkan daripada hampir semua alat lainnya.
lk
55

Jika Anda greptidak mendukung pencarian rekursif, Anda dapat bergabung finddengan 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, misalnya

/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)
RobEarl
sumber
3
Ini sama dengan grep 'text-to-find-here'tanpa nama file jika findtidak menemukan apa pun. Ini akan menggantung dan menunggu input pengguna! Tambahkan --no-run-if-emptysebagai opsi ke xargs.
hagello
3
Kombinasi find dan xargs ini tidak berfungsi sebagaimana mestinya jika nama file atau direktori mengandung spasi (karakter yang xargs tafsirkan sebagai pemisah). Gunakan find … -exec grep … +. Jika Anda bersikeras menggunakan find bersama dengan xargs, gunakan -print0dan -0.
hagello
43
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.
enfinet
sumber
3
Bisakah Anda menjelaskan bagaimana jawaban Anda meningkat pada jawaban yang lain, atau bagaimana itu cukup berbeda dari mereka?
Amos M. Carpenter
tidak terlalu rumit untuk diingat, akan mencakup semua pola (case-senstivity -> off, termasuk nama file dan nomor baris dan akan melakukan pencarian secara rekursif dll) dan menggunakan "*" pada akhirnya akan mencari semua direktori (tidak perlu menentukan apa pun path atau nama direktori).
enfinet
Maaf, saya seharusnya lebih jelas: akan lebih baik jika Anda bisa memasukkan penjelasan itu dalam jawaban Anda. Seperti berdiri, terutama dengan begitu banyak jawaban lain yang serupa sudah, sulit untuk melihat dari seperti jawaban singkat apa manfaat dari mencoba itu lebih jawaban diterima atau salah satu yang upvoted akan.
Amos M. Carpenter
6
@ AmosM.Carpenter Satu hal yang saya sukai dari jawaban ini adalah menunjukkan argumen penekan, yang dapat membantu menyaring suara yang tidak masalah untuk mendapatkan hasil yang sebenarnya kita inginkan. Grep mencetak kesalahan seperti, "Fungsi tidak diterapkan", "Argumen Tidak Valid", "Sumberdaya tidak tersedia", dll. Pada "file" tertentu.
leetNightshade
@leetNightshade: Saya berasumsi Anda menyampaikan komentar Anda kepada saya karena saya meminta penjelasan tentang posting asli yang jarang. Silakan lihat revisi hebat Fabio agar komentar saya sebelumnya masuk akal.
Amos M. Carpenter
39

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 "Search query"

Dan itu akan melakukan tugas untuk Anda!

Neil Agarwal
sumber
35

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 menggunakan find seperti pada contoh Anda, lebih baik tambahkan -s( --no-messages) ke grep, dan 2>/dev/nulldi akhir perintah untuk menghindari banyak izin yang ditolak pesan yang dikeluarkan oleh grepdan find:

find / -type f -exec grep -sH 'text-to-find-here' {} \; 2>/dev/null

find adalah alat standar untuk mencari file - dikombinasikan dengan grep saat mencari teks tertentu - pada platform mirip Unix. The find perintah sering dikombinasikan dengan xargs , by the way.

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/nullperintah ini juga, untuk menyembunyikan banyak pesan kesalahan.


Peringatan : kecuali Anda benar-benar tidak dapat menghindarinya, jangan mencari dari '/' (direktori root) untuk menghindari pencarian yang lama dan tidak efisien! Jadi, dalam contoh di atas, Anda sebaiknya mengganti ' / ' dengan nama sub-direktori, misalnya "/ home" tergantung di mana Anda sebenarnya ingin mencari ...

Bludzee
sumber
'find adalah alat standar untuk mencari file yang berisi teks tertentu pada platform mirip Unix' tampaknya agak ambigu bagi saya. Bahkan selain rekursif grep findtidak secara langsung mencari bagian dalam file untuk teks. Dan mungkin alat-alat tambahan itu berguna untuk beberapa orang kecuali timer lama dan mereka yang terbiasa dengan baik misalnya greptidak akan memberi mereka waktu sama sekali (baik saya tentu tidak akan). Tidak mengatakan mereka tidak berguna.
Pryftan
".... berisi teks tertentu ...": bagian kalimat ini tidak akurat (karena tidak menemukan dirinya yang berkaitan dengan bagian pencarian ini). Diedit. Terima kasih.
Bludzee
Senang bisa membantu! Satu-satunya hal lain dalam sekejap sangat cepat adalah mengubah folder kata ke direktori tetapi saya tahu itu adalah perang salib saya, saya tidak akan pernah menang sepenuhnya. Namun tidak menyerah ...
Pryftan
Mengapa tidak "direktori" bukan "folder", tetapi mengapa? Silakan bagikan "perang salib" Anda!
Bludzee
Saya katakan menggunakan direktori saja! Mengacu pada: Anda sebaiknya mengganti '/' dengan nama sub-folder Dan itu kesal hewan peliharaan saya .. esp karena bahkan Windows dulu menyebutnya 'direktori'. Ah..mungkin Anda mengerti. Mengapa? Ya karena itu namanya. Itu juga disebut di tingkat sistem file. Dan lihat seperti ini: apakah pernah dipanggil (untuk DOS) fol? Tidak, tentu saja tidak; itu disebut dir(dan saya percaya masih demikian). Folder adalah sesuatu yang dibuat untuk (saya kira) keramahan pengguna, tetapi dalam hal ini mungkin membendungnya untuk pengguna yang kurang 'maju'?
Pryftan
29

Mencoba:

find . -name "*.txt" | xargs grep -i "text_pattern"
venkat
sumber
5
Ini sebenarnya adalah contoh utama ketika TIDAK menggunakan xargsseperti itu .. pertimbangkan ini. echo "file bar.txt has bar" > bar.txt; echo "file foo bar.txt has foo bar" > "foo bar.txt"; echo "You should never see this foo" > foo; find . -name "*.txt" | xargs grep -i foo # ./foo:You should never see this foo. Di xargssini cocok dengan file SALAH dan TIDAK cocok dengan file yang dimaksud. Entah menggunakan find .. -print0 | xargs -0 ...tapi itu penggunaan pipa yang tidak berguna atau lebih baikfind ... -exec grep ... {} +
shalomb
29

Gunakan pwduntuk 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 menjadi 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!

mahatmanich
sumber
3
menggunakan pwdtidak diperlukan sama sekali, karena itu adalah default. grep -rnw "pattern"cukup.
fedorqui 'SO berhenti merugikan'
dan faktanya grep -rnwdan sejenisnya adalah apa yang dijawab seperti tiga tahun lalu, saya tidak melihat bagaimana jawaban ini menambah nilai.
fedorqui 'SO berhenti merugikan'
Jawaban yang dipilih tidak menunjukkan pola default, dan 5 orang tampaknya telah menemukannya berguna
mahatmanich
Apa yang Anda maksud dengan "pola default"? Jawaban yang diterima berisi grep -rnw '/path/to/somewhere/' -e "pattern"apa yang Anda miliki di sini. 5 suara setelah kunjungan 2.3 juta tidak berarti banyak.
fedorqui 'SO berhenti merugikan'
Saya setuju :-) apa yang saya lewatkan dalam jawaban asli adalah use case yang Anda tidak harus memberikan path sama sekali atau mencari direktori saat ini secara rekursif yang tidak tercermin dalam jawaban yang diterima. Jadi itu adalah pengalaman belajar yang baik tentang grep untuk menggali sedikit lebih dalam.
mahatmanich
19

grep dapat digunakan bahkan jika kita tidak mencari string.

Cukup berjalan,

grep -RIl "" .

akan mencetak jalur ke semua file teks, yaitu yang hanya berisi karakter yang dapat dicetak.

Alex Jasmin
sumber
2
Saya tidak melihat bagaimana ini lebih baik daripada menggunakan sekadar lsatau find(untuk rekursif)
fedorqui 'SO stop harming'
17

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
Atul Arvind
sumber
5
apa ini menambah jawaban yang ada?
fedorqui 'SO berhenti merugikan'
@ fedorqui egrepsetara dengan grep -Edan itu berarti --extended-regexpAnda dapat menemukan detail di sini unix.stackexchange.com/a/17951/196072
omerhakanbilici
17

Silver Searcher adalah alat yang hebat, tetapi ripgrep mungkin lebih baik.

Ini berfungsi di Linux, Mac dan Windows, dan ditulis di Hacker News beberapa bulan yang lalu (ini memiliki tautan ke Blog Andrew Gallant yang memiliki tautan GitHub):

Ripgrep - Alat pencarian baris perintah baru

AAAfarmclub
sumber
15
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 masker 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
Vinod Joshi
sumber
15

Mencoba:

find / -type f -exec grep -H 'text-to-find-here' {} \;

yang akan mencari semua sistem file, karena /merupakan 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' {} \;
pengguna4863663
sumber
Mungkin detail tentang perbedaan folder jelas bagi banyak orang ... tetapi juga sangat membantu bagi pemula. +1
nilon
1
apa ini menambah jawaban yang ada?
fedorqui 'SO berhenti merugikan'
Sebut saja perang salib saya tetapi kata itu adalah 'direktori'. Ini bukan Windows (yang dulu menggunakan 'direktori' - pra 9x). Tolong berhenti mengatakan 'folder'. Adapun perintah terakhir Anda, Anda bahkan tidak perlu '/' hanya FYI.
Pryftan
15

Semoga ini bisa membantu ...

Memperluas grepbit 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 gagasan tentang jenis file tersebut, Anda dapat mempersempit pencarian Anda dengan menentukan ekstensi tipe file yang akan dicari, dalam hal ini .pasATAU .dfmfile:

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. .di findtentukan dari direktori saat ini.
  2. -name" *.*": Untuk semua file (-name " *.pas" -o -name " *.dfm"): Hanya *.pasOR *.dfmfile, OR ditentukan dengan-o
  3. -type f menentukan bahwa Anda sedang mencari file
  4. -print0dan --nulldi sisi lain |(pipa) adalah yang penting, melewati nama file dari findke yang greptertanam di dalam xargs, memungkinkan untuk lewat nama file DENGAN spasi di nama file, memungkinkan grep untuk memperlakukan path dan nama file sebagai satu string, dan tidak memecahnya di setiap ruang.
Gert van Biljon
sumber
-name '*.*'bukan apa yang kamu katakan; itu tidak akan mengambil pada file yang disebut 'file' karena polanya tidak sama dengan itu (no .ext); *Namun (well. file samping). Tapi ada satu hal lagi: jika Anda ingin semua file mengapa repot menentukan nama file di tempat pertama? Tidak ada komentar lain - kecuali bahwa senang mengetahui bahwa masih ada orang yang tidak menggunakan 'folder' terminologi MS (yang benar-benar setelah mengatakannya cukup saya tidak akan menambahkan tetapi saya ingin menunjukkan pernyataan yang sedikit salah yang Anda buat dengan nama file - serta redundansi / kegunaan dalam kasus 'semua').
Pryftan
15

Sederhana findbisa berguna. alias itu di ~/.bashrcfile Anda :

alias ffind find / -type f | xargs grep

Mulai terminal baru dan terbitkan:

ffind 'text-to-find-here'
danglingpointer
sumber
14

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 sebuah file. Kami menggunakan format ekspresi reguler yang didefinisikan dalam pustaka Python re . 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 yang pyberisi Pool(diikuti oleh kata 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.

Dilawar
sumber
14

Jika Anda benar-benar ingin menggunakan, findgunakan find + grep:

find /path/to/somewhere/ -type f -exec grep -nw 'textPattern' {} \;

Langkah:

1.Gunakan finduntuk mencari file,
2.Kemudian jalankan grepsemua.

Ini dapat memberi Anda kekuatan finduntuk menemukan file.

  • Gunakan -name Patternjika Anda ingin grephanya file tertentu:

    find /path/to/somewhere/ -type f -name \*.cpp -exec grep -nw 'textPattern' {} \;

Anda dapat bermain dengannya dan menggunakan berbagai opsi finduntuk meningkatkan atau mempersempit pencarian file Anda.

BreakBadSP
sumber
Apa bedanya? Apakah ini akan bekerja dengan spasi di path file?
Peter Mortensen
13

Menggunakan:

grep -c Your_Pattern *

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

Dr_Hope
sumber
13

grep adalah teman baik Anda untuk mencapai ini.

grep -r <text_fo_find> <directory>

Jika Anda tidak peduli dengan kasus teks yang akan ditemukan, gunakan:

grep -ir <text_to_find> <directory>
Prash
sumber
Dalam kasus saya sepertinya mencari di mana-mana bahkan jika saya menentukan direktori
Pathros
@Pathros Mungkin ada hubungannya dengan rekursi diaktifkan dan direktori apa yang Anda tentukan. Dengan kata lain rekursi tidak mengubah hal-hal dengan cara itu.
Pryftan
@Pathros Oh dan jika ada -string pencarian yang ingin Anda sampaikan --grep terlebih dahulu; yang dapat menyebabkan efek samping yang menarik sebaliknya!
Pryftan
13

Saya terpesona dengan betapa sederhananya grep membuatnya dengan 'rl':

grep -rl 'pattern_to_find' /path/where/to/find

-r to recursively find a 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

Ini bekerja dengan sempurna ...

nitinr708
sumber
Ini juga berfungsi di Git Bash (Windows).
Peter Mortensen
Tapi itu menyiratkan setiap file harus dicari (tidak ada filter pada nama file atau tingkat ekstensi file, seperti .txt). Atau adakah cara untuk melakukan itu?
Peter Mortensen
12

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;

sumber
1
Saya melihat satu-satunya downside dibandingkan dengan menggunakan find … -exec grep 'str' {} \;(jika Anda harus menggunakan findsama sekali).
phk
1
Ini akan rusak parah jika ada file yang ditemukan oleh findspasi yang terkandung .. Anda bisa berakhir greppingdengan file yang salah dan / atau kehilangan file yang tepat sama sekali. Cukup gunakan find ... -exec grep ...jika Anda memiliki kebutuhan untuk menggunakan find.. tetapi dalam hal ini grep -r ...sudah cukup.
shalomb
1
apa gunanya menggunakan loop atas hasil find untuk kemudian grep? Ini menjadi rumit tidak perlu.
fedorqui 'SO berhenti merugikan'
12

Ada sebuah ack alat yang akan melakukan apa yang Anda cari.

http://linux.die.net/man/1/ack

ack -i search_string folder_path/*

Anda dapat mengabaikan -ipencarian sensitif huruf

Sahabat
sumber
2
Apa ini menambah jawaban yang ada? Ini sudah disarankan lebih dari tiga tahun lalu.
fedorqui 'SO berhenti merugikan'
1
@fedorqui 1) tidak ada pipa! 2) Gunakan ekspresi reguler 3) Dapatkan nomor baris, nama file dengan jalur relatif, teks yang disorot dll. Berguna untuk mengedit setelah pencarian misalnya "vim + jalur lineno / file.cpp" akan membuat Anda langsung di baris yang tidak menarik. Lihat output dari perintah "ack include \ | hpp" yang mencari "sertakan" atau "hpp" kata kunci di bawah folder pencarian saya dan subfolder. Saya harap intinya jelas. Berikut adalah contoh output (Tidak dapat menampilkan highlight kata kunci dengan teks sederhana) proses / child.hpp 11: boost / proses / child.hpp proses / all.hpp 21: #sertakan <boost / proses / execute.hpp>
Pal
12

Semua jawaban sebelumnya menyarankan grep dan temukan. Tetapi ada cara lain: Gunakan Komandan Tengah Malam

Ini adalah utilitas gratis (30 tahun, dibuktikan oleh waktu) yang visual tanpa GUI. Ini memiliki banyak fungsi, dan menemukan file hanyalah salah satunya.

Peter M. - singkatan Monica
sumber
ranger akan berada di ide yang sama
nilon
11

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

find ./ -name "file_pattern_name"  -exec grep -r "pattern" {} \;
Pradeep Goswami
sumber
2
apa gunanya menggunakan findlalu grep -r? Mereka dimaksudkan untuk hal yang sama, jadi ini berlebihan.
fedorqui 'SO stop harming'
ohh !! dikoreksi, Sebenarnya temukan adalah untuk menjalankan grep pada file yang difilter dan tidak semua, terima kasih
Pradeep Goswami
2
masih, ini tidak masuk akal, Anda dapat memfilter dengan find.
fedorqui 'SO stop harming'
11

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