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.
.
sebagai wildcard satu karakter, antara lain. Saran saya adalah selalu gunakan fgrep atau egrep.-H
dengan-l
(dan mungkingrep
denganfgrep
). Untuk mengecualikan file dengan pola nama tertentu yang akan Anda gunakanfind
dengan cara yang lebih maju.find
Meskipun demikian, ada baiknya belajar menggunakan . Adilman find
.find … -exec <cmd> +
lebih mudah untuk mengetik dan lebih cepat daripadafind … -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.grep "pattern" path/*.txt
Jawaban:
Lakukan hal berikut:
-r
atau-R
rekursif,-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-dir
bendera dapat digunakan untuk pencarian efisien:Ini hanya akan mencari file-file yang memiliki ekstensi .c atau .h:
Ini akan mengecualikan pencarian semua file yang diakhiri dengan ekstensi .o:
Untuk direktori dimungkinkan untuk mengecualikan direktori tertentu melalui
--exclude-dir
parameter. Sebagai contoh, ini akan mengecualikan dirs dir1 /, dir2 / dan semuanya cocok * .dst /:Ini bekerja sangat baik bagi saya, untuk mencapai tujuan yang hampir sama seperti milik Anda.
Untuk opsi lainnya, periksa
man grep
.sumber
r
pilihannya adalah malas (melintasi kedalaman-pertama, daripada berhenti setelah direktori pertama), sementaraR
itu rakus (akan melintasi seluruh pohon dengan benar).R
enr
akan melintasi direktori dengan benar, tetapiR
akan mengikuti tautan simbolik.Anda bisa menggunakan
grep -ilR
: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.sumber
-i
membuatnya 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 mengujinyatime
di depan baris./*
singkatan dari itu. Pokoknya saya baru mengujinya dan memperhatikan bahwa itu hanya/
berfungsi.fgrep is the same as grep -F -> Interpret PATTERN as a list of fixed strings
.grep -Ril "text-to-find-here" ~/sites/
atau menggunakan. untuk direktori saat inigrep -Ril "text-to-find-here" .
Anda bisa menggunakan ack . Ini seperti grep untuk kode sumber. Anda dapat memindai seluruh sistem file Anda dengannya.
Kerjakan saja:
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
.gitignore
file.sumber
Kamu bisa menggunakan:
The
r
singkatan 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):
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
sumber
Anda bisa menggunakan ini:
sumber
Daftar nama file yang mengandung teks yang diberikan
Pertama-tama, saya percaya Anda telah menggunakan
-H
bukan-l
. Anda juga dapat mencoba menambahkan teks di dalam tanda kutip diikuti oleh{} \
.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).
Hapus sensitivitas huruf
Bahkan jika Anda tidak menggunakan case seperti "text" vs "TEXT", Anda dapat menggunakan
-i
sakelar untuk mengabaikan case. Anda dapat membaca detail lebih lanjut di sini .Semoga ini bisa membantu Anda.
sumber
find
akan melewati semua jalur yang ditemukannya ke perintahgrep -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
-iname
case-insensitive yang berarti juga akan menemukan file .TXT, misalnya, serta TxT dan TXt dan sebagainya.grep
( GNU atau BSD )Anda dapat menggunakan
grep
alat untuk mencari folder saat ini secara rekursif, seperti:Catatan:
-r
- Sub direktori pencarian secara rekursif.Anda juga dapat menggunakan sintaks globbing untuk mencari di dalam file tertentu 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 mengerjakan proyek yang lebih besar atau file besar, Anda harus menggunakannya
ripgrep
, seperti: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
,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
Jika Anda
grep
tidak mendukung pencarian rekursif, Anda dapat bergabungfind
denganxargs
:Saya menemukan ini lebih mudah diingat daripada format untuk
find -exec
.Ini akan menampilkan nama file dan konten dari baris yang cocok, misalnya
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)sumber
grep 'text-to-find-here'
tanpa nama file jikafind
tidak menemukan apa pun. Ini akan menggantung dan menunggu input pengguna! Tambahkan--no-run-if-empty
sebagai opsi kexargs
.find … -exec grep … +
. Jika Anda bersikeras menggunakan find bersama dengan xargs, gunakan-print0
dan-0
.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.sumber
Ada utilitas baru bernama The Silversearcher
Ia bekerja erat dengan Git dan VCS lainnya. Jadi, Anda tidak akan mendapatkan apa pun di .git atau direktori lain.
Anda cukup menggunakan
Dan itu akan melakukan tugas untuk Anda!
sumber
Jika menggunakan find seperti pada contoh Anda, lebih baik tambahkan
-s
(--no-messages
) kegrep
, dan2>/dev/null
di akhir perintah untuk menghindari banyak izin yang ditolak pesan yang dikeluarkan olehgrep
danfind
: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:
Pencari Perak :
ack :
Catatan: Anda dapat menambahkan
2>/dev/null
perintah 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 ...
sumber
grep
find
tidak 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 misalnyagrep
tidak akan memberi mereka waktu sama sekali (baik saya tentu tidak akan). Tidak mengatakan mereka tidak berguna.fol
? Tidak, tentu saja tidak; itu disebutdir
(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'?Mencoba:
sumber
xargs
seperti 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
. Dixargs
sini cocok dengan file SALAH dan TIDAK cocok dengan file yang dimaksud. Entah menggunakanfind .. -print0 | xargs -0 ...
tapi itu penggunaan pipa yang tidak berguna atau lebih baikfind ... -exec grep ... {} +
Gunakan
pwd
untuk mencari dari direktori mana pun Anda berada, berulang ke bawahPembaruan 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!
sumber
pwd
tidak diperlukan sama sekali, karena itu adalah default.grep -rnw "pattern"
cukup.grep -rnw
dan sejenisnya adalah apa yang dijawab seperti tiga tahun lalu, saya tidak melihat bagaimana jawaban ini menambah nilai.grep -rnw '/path/to/somewhere/' -e "pattern"
apa yang Anda miliki di sini. 5 suara setelah kunjungan 2.3 juta tidak berarti banyak.grep
dapat digunakan bahkan jika kita tidak mencari string.Cukup berjalan,
akan mencetak jalur ke semua file teks, yaitu yang hanya berisi karakter yang dapat dicetak.
sumber
ls
ataufind
(untuk rekursif)Berikut adalah beberapa daftar perintah yang dapat digunakan untuk mencari file.
sumber
egrep
setara dengangrep -E
dan itu berarti--extended-regexp
Anda dapat menemukan detail di sini unix.stackexchange.com/a/17951/196072Silver 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
sumber
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.
sumber
Mencoba:
yang akan mencari semua sistem file, karena
/
merupakan folder root.Untuk penggunaan folder rumah:
Untuk penggunaan folder saat ini:
sumber
Semoga ini bisa membantu ...
Memperluas
grep
bit untuk memberikan lebih banyak informasi dalam output, misalnya, untuk mendapatkan nomor baris dalam file di mana teks dapat dilakukan sebagai berikut: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
.pas
ATAU.dfm
file:Penjelasan singkat tentang opsi:
.
difind
tentukan dari direktori saat ini.-name
"*.*
": Untuk semua file (-name "*.pas
" -o -name "*.dfm
"): Hanya*.pas
OR*.dfm
file, OR ditentukan dengan-o
-type f
menentukan bahwa Anda sedang mencari file-print0
dan--null
di sisi lain|
(pipa) adalah yang penting, melewati nama file darifind
ke yanggrep
tertanam di dalamxargs
, 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.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').Sederhana
find
bisa berguna. alias itu di~/.bashrc
file Anda :Mulai terminal baru dan terbitkan:
sumber
Saya menulis skrip Python yang melakukan hal serupa. Ini adalah bagaimana seseorang harus menggunakan skrip ini.
Argumen pertama
path
,, adalah direktori di mana kita akan mencari secara rekursif. Argumen keduapattern_to_search
,, adalah ekspresi reguler yang ingin kita cari dalam sebuah file. Kami menggunakan format ekspresi reguler yang didefinisikan dalam pustaka 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 yang
py
berisiPool(
diikuti oleh kataAdaptor
, saya melakukan hal berikut,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.
sumber
Jika Anda benar-benar ingin menggunakan,
find
gunakanfind + grep
:find /path/to/somewhere/ -type f -exec grep -nw 'textPattern' {} \;
Langkah:
1.Gunakan
find
untuk mencari file,2.Kemudian jalankan
grep
semua.Ini dapat memberi Anda kekuatan
find
untuk menemukan file.Gunakan
-name Pattern
jika Anda ingingrep
hanya file tertentu:find /path/to/somewhere/ -type f -name \*.cpp -exec grep -nw 'textPattern' {} \;
Anda dapat bermain dengannya dan menggunakan berbagai opsi
find
untuk meningkatkan atau mempersempit pencarian file Anda.sumber
Menggunakan:
Ini akan melaporkan berapa banyak salinan pola Anda ada di setiap file di direktori saat ini.
sumber
grep adalah teman baik Anda untuk mencapai ini.
Jika Anda tidak peduli dengan kasus teks yang akan ditemukan, gunakan:
sumber
-
string pencarian yang ingin Anda sampaikan--
grep terlebih dahulu; yang dapat menyebabkan efek samping yang menarik sebaliknya!Saya terpesona dengan betapa sederhananya grep membuatnya dengan 'rl':
Ini bekerja dengan sempurna ...
sumber
.txt
). Atau adakah cara untuk melakukan itu?Untuk mencari string dan output sesuai dengan string pencarian:
misalnya:
Untuk menampilkan nama file yang berisi string pencarian:
misalnya:
sumber
find … -exec grep 'str' {} \;
(jika Anda harus menggunakanfind
sama sekali).find
spasi yang terkandung .. Anda bisa berakhirgrepping
dengan file yang salah dan / atau kehilangan file yang tepat sama sekali. Cukup gunakanfind ... -exec grep ...
jika Anda memiliki kebutuhan untuk menggunakanfind
.. tetapi dalam hal inigrep -r ...
sudah cukup.Ada sebuah
ack
alat yang akan melakukan apa yang Anda cari.http://linux.die.net/man/1/ack
Anda dapat mengabaikan
-i
pencarian sensitif hurufsumber
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.
sumber
Perintah di bawah ini akan berfungsi dengan baik untuk pendekatan ini:
sumber
find
lalugrep -r
? Mereka dimaksudkan untuk hal yang sama, jadi ini berlebihan.find
.Hindari kerepotan dan instal ack-grep. Ini menghilangkan banyak masalah izin dan kutipan.
Lalu pergi ke direktori yang ingin Anda cari dan jalankan perintah di bawah ini
sumber