Pertanyaan Bagaimana saya menemukan semua file yang berisi teks tertentu di Linux?


Saya mencoba mencari cara untuk memindai seluruh sistem Linux saya untuk semua file yang berisi rangkaian teks tertentu. Hanya untuk memperjelas, saya mencari teks di dalam file, bukan di 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 saya? Kemampuan untuk menemukan string teks dalam file akan sangat berguna untuk beberapa proyek pemrograman yang saya lakukan.


3677
2018-06-06 08:06


asal


Jawaban:


Lakukan hal berikut:

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

Bersamaan dengan ini, --exclude, --include, --exclude-dir bendera dapat digunakan untuk pencarian yang efisien:

  • Ini hanya akan mencari melalui file-file yang memiliki ekstensi .c atau .hh:

    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 (ies) melalui --exclude-dir parameter. Sebagai contoh, ini akan mengecualikan dir1 dir1 /, dir2 / dan semuanya sesuai * .dst /:

    grep --exclude-dir={dir1,dir2,*.dst} -rnw '/path/to/somewhere/' -e "pattern"
    

Ini bekerja sangat baik untuk saya, untuk mencapai tujuan yang hampir sama seperti milik Anda.

Untuk opsi lainnya, periksa man grep.


6648
2018-06-06 08:21



Kamu dapat memakai grep -ilR:

grep -Ril "text-to-find-here" /
  • i singkatan dari ignore case (opsional dalam kasus Anda).
  • R singkatan rekursif.
  • l singkatan "tampilkan nama file, bukan hasil sendiri".
  • / kependekan dari mulai dari akar komputer Anda.

1085
2018-06-06 08:08



Kamu dapat memakai ack. Ini seperti grep untuk kode sumber. Anda dapat memindai seluruh sistem file Anda dengan itu.

Kerjakan saja:

ack 'text-to-find-here'

Di direktori root Anda.

Anda juga bisa menggunakan ekspresi reguler, tentukan jenis file, dll.


MEMPERBARUI

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


232
2018-06-06 08:26



Kamu dapat memakai:

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

Itu r singkatan dari rekursif dan akan mencari di jalur yang ditentukan dan juga sub-direktori. Ini akan memberi tahu Anda nama file serta mencetak baris di file tempat 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 garis di file tempat teks muncul, tetapi tidak mencetak nama file.

Selain perintah ini, kita bisa menulis ini juga: grep -rn "String to search" / path / to / directory / atau / file -r: pencarian rekursif n: nomor baris akan ditampilkan untuk pertandingan


125
2018-03-14 23:29



Anda dapat menggunakan ini:

grep -inr "Text" folder/to/be/searched/

83
2017-07-31 13:44



Daftar nama file yang berisi teks tertentu

Pertama-tama, saya yakin Anda telah menggunakannya -H dari pada -l. Anda juga dapat mencoba menambahkan teks di dalam tanda kutip diikuti {} \.

find / -type f -exec grep -l "text-to-find-here" {} \; 

Contoh

Katakanlah Anda sedang mencari file yang berisi teks spesifik "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 kepekaan kasus

Bahkan jika Anda tidak menggunakan kasus seperti "teks" vs "TEXT", Anda dapat menggunakan -i beralih untuk mengabaikan huruf besar. Anda dapat membaca detail lebih lanjut sini.

Semoga ini bisa membantu Anda.


48
2017-11-09 13:18



Jika Anda grep tidak mendukung pencarian rekursif, Anda dapat menggabungkan find dengan xargs:

find / -type f | xargs grep 'text-to-find-here'

Saya merasa 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 grep:

  • -i - pencarian tidak sensitif huruf
  • -l - hanya output nama file tempat pertandingan ditemukan
  • -h - hanya output garis yang cocok (bukan nama file)

46
2018-06-20 08:49