Bagaimana saya bisa menggunakan grep untuk menemukan kata di dalam folder?

542

Di Windows, saya akan melakukan pencarian untuk menemukan kata di dalam folder. Demikian pula, saya ingin tahu apakah ada kata tertentu di dalam direktori yang berisi banyak sub-direktori dan file. Pencarian saya untuk sintaks grep menunjukkan saya harus menentukan nama file, yaitu grep string filename.

Sekarang, saya tidak tahu nama file, jadi apa yang harus saya lakukan? Seorang teman menyarankan untuk melakukannya grep -nr string, tetapi saya tidak tahu apa artinya ini dan saya tidak mendapatkan hasil dengan itu (tidak ada jawaban sampai saya mengeluarkan a ctrl + c).

kiki
sumber

Jawaban:

849
grep -nr 'yourString*' .

Titik di akhir mencari direktori saat ini. Berarti untuk setiap parameter:

-n            Show relative line number in the file
'yourString*' String for search, followed by a wildcard character
-r            Recursively search subdirectories listed
.             Directory for search (current directory)

grep -nr 'MobileAppSer*' . (Akan menemukan MobileAppServlet.javaatau MobileAppServlet.classatau MobileAppServlet.txt; 'MobileAppASer*.*'adalah cara lain untuk melakukan hal yang sama.)

Untuk memeriksa lebih banyak parameter, gunakan perintah man grep .

Manish Ranjan
sumber
14
Dengan bisnis apa *? Entah akan menghasilkan ekspansi wildcard shell (jika ada nama file yang cocok dengan pola wildcard), atau grep akan menganggapnya sebagai 0 atau atau lebih operator pengulangan untuk karakter sebelumnya *.
usta
7
Sekarang mari kita mempertimbangkan kedua kemungkinan grep -nr MobileAppSer* .1. Anggaplah kita memiliki 3 file dalam direktori yang cocok saat ini MobileAppSer*pola wildcard: bernama MobileAppServlet.java, MobileAppServlet.class, MobileAppServlet.txt. Kemudian grepakan dipanggil seperti ini: grep -nr MobileAppServlet.class MobileAppServlet.java MobileAppServlet.txt .. Itu berarti mencari teks "MobileAppServlet.class" di file MobileAppServlet.java, MobileAppServlet.txt, dan di tempat lain di direktori saat ini - yang tentunya bukan yang diinginkan pengguna di sini.
usta
7
2. Jika tidak ada file dalam direktori saat ini yang cocok dengan MobileAppSer*pola wildcard, grepakan menerima argumen MobileAppSer*apa adanya dan dengan demikian akan menganggapnya sebagai pencarian untuk teks "MobileAppSe" diikuti oleh 0 atau lebih kemunculan "r", sehingga akan berusaha menemukan teks "MobileAppSe", "MobileAppSer", "MobileAppSerr", "MobileAppSerrr", dll. dalam isi file direktori saat ini - bukan apa yang diinginkan pengguna juga.
usta
5
Ini adalah pilihan regex yang meragukan. Usta telah menunjukkan ini.
kindleimple
117
grep -nr string my_directory

Catatan tambahan: ini memenuhi sintaks grep [options] string filenamekarena dalam sistem mirip Unix, direktori adalah sejenis file (ada istilah "file biasa" yang secara khusus merujuk pada entitas yang disebut hanya "file" di Windows).

grep -nr string membaca konten untuk mencari dari input standar, itu sebabnya ia hanya menunggu input dari Anda, dan berhenti melakukannya ketika Anda menekan ^ C (itu akan berhenti pada ^ D juga, yang merupakan kombinasi tombol untuk akhir-dari -mengajukan).

usta
sumber
1
Hei, jadi jika saya ingin mencari string terlepas dari kasus ini, harus saya lakukan ini: grep -i -nr "my word".
kiki
2
@kiki: Ya, yang setara dengangrep -inr "my word" .
usta
16
@kiki: -runtuk grep berarti pencarian dalam subdirektori secara rekursif dan -nberarti awalan setiap baris output dengan nomor baris yang sesuai dari file yang berisi baris itu. man grepmenjelaskan semua ini, dan banyak lagi.
usta
62

GREP : Cetak Ekspresi Reguler Global / Parser / Prosesor / Program.
Anda dapat menggunakan ini untuk mencari direktori saat ini.
Anda dapat menentukan -R untuk "rekursif", yang berarti program mencari di semua subfolder, dan subfoldernya, dan subfoldernya, dll.

grep -R "your word" .

-nakan mencetak nomor baris, yang cocok dengan file.
-iakan mencari case-insensitive (huruf kapital / non-kapital).

grep -inR "your regex pattern" .
Stefan Steiger
sumber
3
./* berarti semua file di direktori saat ini, -R berarti rekursif (mencari subdirektori, dll.)
Stefan Steiger
25
grep -nr search_string search_dir

akan melakukan pencarian RECURSIVE (artinya direktori dan semua subdirektori) untuk search_string. (seperti yang dijawab dengan benar oleh usta).

Alasan Anda tidak mendapatkan jawaban dengan saran teman Anda tentang:

grep -nr string

karena tidak ada direktori yang ditentukan. Jika Anda berada di direktori tempat Anda ingin melakukan pencarian, Anda harus melakukan hal berikut:

grep -nr string .

Penting untuk memasukkan '.' karakter, karena ini memberitahu grep untuk mencari direktori INI.

Nico Huysamen
sumber
Hai, apa yang harus saya lakukan, jika saya harus mencari 2 kata dengan spasi di antaranya? Haruskah kata-kata tersebut ditentukan dalam tanda kutip? yaitu grep -nr "kata saya".
kiki 8-10
24

Ada juga:

find directory_name -type f -print0 | xargs -0 grep -li word

tapi itu mungkin agak banyak untuk pemula.

findadalah walker / lister tujuan umum, yang -type fberarti "mencari file biasa daripada direktori dan pipa bernama dan apa pun yang Anda", -print0berarti "mencetaknya pada output standar menggunakan karakter null sebagai pembatas". Output dari finddikirim ke xargs -0dan yang mengambil input standar dalam potongan (untuk menghindari batasan panjang baris perintah) menggunakan karakter nol sebagai pemisah rekaman (daripada baris baru standar) dan berlaku grep -li worduntuk setiap set file. Pada grep, -lberarti "daftar file yang cocok" dan -iberarti "tidak sensitif huruf besar"; Anda biasanya dapat menggabungkan opsi karakter tunggal sehingga Anda akan melihat -lilebih sering daripada -l -i.

Jika Anda tidak menggunakan -print0dan -0kemudian Anda akan mengalami masalah dengan nama file yang mengandung spasi sehingga menggunakannya adalah kebiasaan yang baik.

mu terlalu pendek
sumber
1
@mmmshuddup: Terima kasih. Saya merasa tidak enak jika saya tidak memberikan penjelasan sebagai bagian dari jawaban, terutama ketika bekerja dengan seorang pemula.
mu terlalu pendek
1
Itulah yang paling saya hargai di situs ini. Penting untuk diingat bahwa kita semua adalah pemula sekali dan tidak mudah muncul di dunia teknologi!
Ya Barry
dapatkah saya mengecualikan direktori tertentu? @muistooshort
Ferologics
@Ferologics Seharusnya ada, periksa man finddari baris perintah untuk melihat opsi apa yang Anda finddukung.
mu terlalu pendek
8

Mengapa tidak melakukan pencarian rekursif untuk menemukan semua instance di sub direktori:

grep -r 'text' *

Ini bekerja seperti pesona.

Paxwell
sumber
1
Tidak perlu mengutip string pencarian tanpa karakter khusus seperti spasi
Scott Stensland
5
  1. grep -r "yourstring" * Akan menemukan "yourstring" di semua file dan folder

Sekarang jika Anda ingin mencari dua string yang berbeda secara bersamaan, Anda selalu dapat menggunakan opsi E dan menambahkan kata-kata untuk pencarian. contoh setelah istirahat

  1. grep -rE "yourstring|yourotherstring|$" *akan mencari lokasi daftar tempat yourstringatau yourotherstringcocok
Nwaoga
sumber
4

Opsi lain yang saya suka gunakan:

find folder_name -type f -exec grep your_text  {} \;

-type f mengembalikan Anda hanya file dan bukan folder

-exec dan {} menjalankan grep pada file yang ditemukan dalam pencarian (sintaks yang tepat adalah "-exec command {}").

jfhfhf839
sumber
4
grep -R "string" /directory/

-R mengikuti juga symlink ketika -r tidak.

DimiDak
sumber
2

Jawaban yang Anda pilih baik-baik saja, dan itu berfungsi, tetapi itu bukan cara yang tepat untuk melakukannya, karena:

grep -nr yourString* .

Ini sebenarnya mencari string "yourStrin"dan "g"0 atau berkali-kali.

Jadi cara yang tepat untuk melakukannya adalah:

grep -nr \w*yourString\w* .

Perintah ini mencari string dengan karakter apa pun sebelum dan sesudah di folder saat ini.

eLRuLL
sumber
2
Namun grep -nr yourStringbekerja juga, karena terlihat telanjang yourStringdi mana saja di baris (atau setidaknya itu pada sistem saya, OSX Lion)
theheadofabroom
1

Mirip dengan jawaban yang diposting oleh @eLRuLL, cara yang lebih mudah untuk menentukan pencarian yang menghormati batasan kata adalah dengan menggunakan -wopsi:

grep -wnr "yourString" .
Mike Slinn
sumber
Di jendela cmd prompt atau terminal windows istilah grep tidak dikenali
kouty
@kouty grep adalah perintah Unix. itechtics.com/using-findstr-windows
Hugo M. Zuleta
1

Jalankan (terminal) perintah berikut di dalam direktori. Itu akan secara rekursif memeriksa di dalam subdirektori juga.

grep -r 'your string goes here' * 
Iwantha
sumber
0

Contoh berikut terlihat secara rekursif your search stringdi *.xmldan *.jsfile yang terletak di suatu tempat di dalam folder path1, path2dan path3.

grep -r --include=*.xml --include=*.js "your search string" path1 path2 path3

Jadi, Anda dapat mencari di subset file untuk banyak direktori, cukup memberikan path di akhir.

Yucer
sumber
-4

Jangan gunakan grep. Unduh Silver Searcher atau ripgrep . Keduanya luar biasa, dan jauh lebih cepat daripada grep atau ack dengan banyak pilihan.

AAAfarmclub
sumber
2
Ini mungkin alat yang hebat tetapi ini tidak menjawab bagaimana saya akan menggunakan alat ini untuk mencapai apa yang diminta OP.
jmathew