Saya ingin menemukan semua file yang berisi string teks tertentu. The grep
perintah bekerja, tapi saya tidak tahu bagaimana menggunakannya untuk setiap direktori (saya hanya bisa melakukannya untuk direktori saya saat ini). Saya mencoba membaca man grep
, tetapi tidak membuahkan hasil.
command-line
grep
Senyum. Pemburu
sumber
sumber
--include="*.C"
opsi, @ user311346, terima kasih kepada @Lekensteyn.Jawaban:
Akan lebih baik digunakan
dimana
-r
(atau--recursive
) opsi digunakan untuk melintasi juga semua sub-direktori/path
, sedangkan-l
--files-with-matches
Opsi (atau ) digunakan untuk hanya mencetak nama file file yang cocok, dan bukan baris yang cocok (ini juga dapat meningkatkan kecepatan, mengingat bahwagrep
berhenti membaca file pada awalnya cocok dengan opsi ini).sumber
-rlF
switch,-F
untuk "string tetap" (dan bukan regexp - misalnya). Tentu saja, jika tugas itu menggunakan regexps, maka permisi. Tentu saja, teori yang sama tanpa -r juga, saya sering melihat bahwa orang menganggap pencarian grep "teks" dan itu dapat menyebabkan masalah mana yang khusus yang berarti sesuatu sebagai regexp.-i
flag yang mengabaikan case.--recursive
opsi, ada banyak opsi dan skenario penggunaan yang bisa dibicarakan. Saya mulai dari jawaban yang diterima @dmityugov dan dimodifikasi untuk bekerja tanpafind
.--include '*.h'
Jika Anda mencari baris yang cocok dengan file, perintah favorit saya adalah:
-H
menyebabkan nama file dicetak (tersirat ketika banyak file dicari)-r
melakukan pencarian rekursif-n
menyebabkan nomor baris dicetakpath/to/files
bisa.
dengan mencari di direktori saat iniOpsi lebih lanjut yang menurut saya sangat berguna:
-I
abaikan file biner (komplemen:-a
memperlakukan semua file sebagai teks)-F
perlakukansearch term
sebagai literal, bukan ekspresi reguler-i
lakukan pencarian case-insensitive--color=always
untuk memaksa warna bahkan ketika disalurkan melaluiless
. Untuk membuatless
warna dukungan, Anda perlu menggunakan-r
opsi:--exclude-dir=dir
berguna untuk mengecualikan direktori seperti.svn
dan.git
.sumber
-H
pada folder berlebihan, jika ada lebih dari satu file, seperti kemungkinan. Faktanya, halaman manual mengatakan-H, --with-filename: Print the file name for each match. This is the default when there is more than one file to search.
--include '*.*'
grep --exclude='*~' ...
Saya yakin Anda bisa menggunakan sesuatu seperti ini:
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
menetapkan bahwa ia hanya boleh memproses file, bukan direktori, dll.-exec grep
menetapkan bahwa untuk setiap file yang ditemukan, ia harus menjalankan perintah grep, meneruskan nama filenya sebagai argumen, dengan mengganti{}
dengan nama filesumber
-name '*.py'
membatasi pertandingan ke file yang berakhiran '.py'.... -exec bash -c 'grep -r "mystring" {} && echo {}' \;
Perintah default saya adalah
Saya menggunakan capitol 'R' karena
ls
menggunakannya untuk rekursif. Karena grep menerima keduanya, tidak ada alasan untuk tidak menggunakannya.EDIT: per HVNSweeting, tampaknya
-R
akan mengikuti symlink dimana-r
tidak akan.sumber
shopt -s dotglob
(ingat-s
sebagai "set"). Hati-hati saat menghapus file. Jika Anda sudah mengaktifkan dotglob,rm -r *
hapus semua yang ada di dir saat ini, tetapi juga direktori di atasnya karena..
cocok. Untuk menonaktifkan dotglob, gunakanshopt -u dotglob
("unset"). Perubahannya bersifat sementara, itu hanya berlaku untuk shell saat ini.shopt -s dotglob & <grep cmd> & shopt -y dotglob
hanya lebih nyaman? Dengan cara ini kita tidak perlu khawatir tentang mengatur ulanggrep -Rin string .
dalam sebagian besar kasus ini. Saya hanya menggunakan * karena tampaknya lebih alami.R
akan mengikuti tautan simbolis,r
tidakJika Anda ingin mencoba sesuatu yang baru, coba
ack
. Perintah untuk mencari direktori saat ini secara rekursifstring
adalah:Instalasi cukup sederhana:
(Asalkan Anda sudah memiliki direktori
~/bin
dan lebih disukai diPATH
.)sumber
chmod
perintah? Apakah mereka khususchmod
atau terkait bash (!#:3
bagian)?!
adalah penanda acara . Mereka cukup kuat untuk menghindari pengulangan.!#:3
referensi token ketiga dari baris perintah sejauh ini, yaitu~/bin/ack
dalam hal ini.Perintah rgrep didedikasikan untuk kebutuhan seperti itu
Jika tidak tersedia, Anda bisa mendapatkannya seperti ini
Anda dapat langsung menetapkan opsi grep default seperti dijelaskan di atas.
Saya personnaly gunakan
topik terkait: bagaimana cara selalu menggunakan rgrep dengan warna
sumber
Pembaruan 2:
Baris perintah ini menggunakan
find
dangrep
memperbaiki masalah:--color=<always or auto>
untuk output berwarna:Contoh:
Contoh dijalankan dalam snapshot di bawah ini:
Pembaruan 1:
Anda dapat mencoba kode berikut; sebagai fungsi di skrip Anda
.bashrc
atau.bash_aliases
atau di:Pemakaian:
wherein /path/to/search/in/ searchkeyword
contoh:
(Catatan: Seperti yang disarankan dalam komentar di bawah ini oleh @enzotib, ini tidak berfungsi dengan file / direktori termasuk spasi di namanya).
Pos asli
Untuk mencari string dan output sesuai dengan string pencarian:
misalnya:
Untuk menampilkan nama file yang berisi string pencarian:
misalnya:
sumber
grep
, di samping itu menjadi subset menggunakanfind
dengangrep
... tetapi jika Anda menerima switch dan tweak yang berbeda sebagai jawaban yang berbeda, mungkin milik saya akan cocok di sini juga .. atau apakah Anda berbeda? pembaruan terakhir melakukan apa yang saya inginkan dalam pencarian saya: nama file dengan baris dengan kunci pencarian dan baris no. juga :) dan keluaran berwarna dan filter kesalahan untuk keterbacaan yang lebih baik ..grep
( GNU atau BSD )Anda dapat menggunakan
grep
alat untuk mencari secara rekursif folder saat ini dengan-r
parameter, seperti:Catatan:
-r
- Sub direktori pencarian secara rekursif.Untuk mencari di dalam file tertentu, Anda dapat menggunakan sintaks globbing seperti:
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
find
sintaksis seperti:Atau gunakan
ripgrep
.ripgrep
Jika Anda bekerja pada proyek-proyek yang lebih besar atau file-file besar, Anda harus menggunakan
ripgrep
sebaliknya, seperti:Periksa 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
,pt
atau 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
.gitignore
file, 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
.sumber
Saya melakukan ini menggunakan xargs, perintah yang sangat diremehkan
find ./ memberi Anda daftar rekursif dari semua file di folder saat ini kemudian Anda pipa ke xargs yang mengeksekusi perintah grep pada masing-masing file tersebut
sumber
xargs
tanpa-print0
opsi kefind
dan-0
opsi untukxargs
tidak digunakan lagi, itu akan gagal pada nama file yang mengandung spasi.Saya tahu ada banyak jawaban di sini, tetapi inilah alternatif jika Anda ingin menambahkan batasan lain saat mencari file:
Ini berfungsi karena
grep
akan mengembalikan 0 jika menemukan hasil, 1 sebaliknya. Misalnya Anda dapat menemukan file berukuran 1 MB dan berisi sesuatu:Untuk beberapa persyaratan, Anda mungkin ingin menggunakan bendera pengoptimal
-O
yang ada di GNU grep.sumber
Sebuah skrip (find-in-code) untuk dicari dalam C, kode CPP:
Menggunakan:
sumber