Saya ingin menemukan semua file yang berisi string teks tertentu. The grep
perintah berfungsi, tetapi saya tidak tahu cara menggunakannya untuk setiap direktori (saya hanya bisa melakukannya untuk direktori saya saat ini). Saya mencoba membaca man grep
, tapi itu tidak menghasilkan bantuan apa pun.
Akan lebih baik menggunakan
grep -rl "string" /path
dimana
-
-r
(atau--recursive
) Opsi digunakan untuk melintasi juga semua sub-direktori dari/path
, sedangkan -
-l
(atau--files-with-matches
) Opsi digunakan untuk hanya mencetak nama file dari file yang cocok, dan bukan garis yang cocok (ini juga dapat meningkatkan kecepatan, mengingat itugrep
berhenti membaca file pada pertandingan pertama dengan opsi ini).
Jika Anda mencari baris yang cocok dalam file, perintah favorit saya adalah:
grep -Hrn 'search term' path/to/files
-
-H
menyebabkan nama file yang akan dicetak (tersirat ketika beberapa file yang dicari) -
-r
melakukan pencarian rekursif -
-n
menyebabkan nomor baris dicetak
path/to/files
dapat berupa .
untuk mencari di direktori saat ini
Opsi lebih lanjut yang menurut saya sangat berguna:
-
-I
abaikan berkas biner (komplemen:-a
perlakukan semua file sebagai teks) -
-F
mengobatisearch term
sebagai literal, bukan ekspresi reguler -
-i
lakukan pencarian case-sensitive -
--color=always
untuk memaksa warna bahkan ketika pipa melaluiless
. Untuk membuatless
warna dukungan, Anda perlu menggunakan-r
opsi:grep -Hrn search . | less -r
-
--exclude-dir=dir
berguna untuk mengecualikan direktori seperti.svn
dan.git
.
Saya percaya Anda dapat menggunakan sesuatu seperti ini:
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 di subdirektori dari jalur yang diberikan. Jika Anda tidak menentukan topeng yang filesnames harus memenuhi, itu menyebutkan semua objek direktori.
-
-type f
menentukan bahwa itu harus memproses hanya file, bukan direktori dll. -
-exec grep
menentukan bahwa untuk setiap file yang ditemukan, itu harus menjalankan perintah grep, meneruskan nama filenya sebagai argumen untuk itu, dengan mengganti{}
dengan nama berkas
Perintah default saya adalah
grep -Rin string *
Saya menggunakan capitol ' R ' karena ls
menggunakannya untuk rekursif. Karena grep menerima keduanya, tidak ada alasan untuk tidak menggunakannya.
EDIT: per HVNSweeting, rupanya -R
akan mengikuti symlink dimana -r
tidak akan.
Jika Anda ingin mencoba sesuatu yang baru, berikan ack
tembakan. Perintah untuk mencari direktori saat ini secara rekursif string
adalah:
ack string
Instalasi cukup sederhana:
curl http://betterthangrep.com/ack-standalone > ~/bin/ack && chmod 0755 !#:3
(Asalkan Anda sudah punya direktori ~/bin
dan itu lebih disukai di Anda PATH
.)
Perintah rgrep didedikasikan untuk kebutuhan tersebut
Jika tidak tersedia, Anda bisa mendapatkannya seperti ini
mkdir -p ~/bincd ~/binwget http://sdjf.esmartdesign.com/files/rgrepchmod +x rgrep
Anda dapat langsung mengatur ke opsi grep default Anda seperti dijelaskan di atas.
Saya personnaly menggunakan
[[ ${#args} -lt 5 && "${args//[[:space:]]/}" == "-i" ]] && args="-Hin"args="${args:--Hns} --color=auto"
topik terkait : cara selalu menggunakan rgrep dengan warna
Pembaruan 2:
Baris perintah ini menggunakan find
dan grep
memperbaiki masalah:
$ find path_to_search_in -type f -exec grep -in searchString {} 2> /dev/null +
--color=<always or auto>
untuk output berwarna:
$ find path_to_search_in -type f \ -exec grep --color=always -in searchString {} 2>/dev/null +
Contoh:
$ find /tmp/test/ -type f -exec grep --color=auto -in "Search string" {} 2>/dev/null +
Contoh dijalankan dalam snapshot di bawah ini:
Pembaruan 1:
Anda dapat mencoba kode berikut; sebagai fungsi dalam Anda .bashrc
atau .bash_aliases
atau dalam naskah:
wherein () { for i in $(find "$1" -type f 2> /dev/null); do if grep --color=auto -i "$2" "$i" 2> /dev/null; then echo -e "\033[0;32mFound in: $i \033[0m\n"; fi; done}
Penggunaan: wherein /path/to/search/in/ searchkeyword
contoh:
$ wherein ~/Documents/ "hello world"
(Catatan: seperti yang disarankan dalam komentar di bawah oleh @enzotib, ini tidak berfungsi dengan file/direktori termasuk spasi di Namanya.)
Posting asli
Untuk mencari string dan output hanya baris itu 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;
grep
(GNU atau BSD)
Anda dapat menggunakan grep
alat untuk mencari secara rekursif folder saat ini dengan -r
parameter, seperti:
grep -r "pattern" .
Catatan: -r
- Secara rekursif mencari subdirektori.
Untuk mencari di dalam file tertentu, Anda dapat menggunakan sintaks globbing seperti:
grep "class foo" **/*.c
Catatan: dengan menggunakan opsi globbing (**
), ini 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 bahwa argumen Anda terlalu panjang, pertimbangkan untuk mempersempit pencarian Anda, atau gunakan find
sintaks bukan 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 menggunakan ripgrep
sebaliknya, seperti:
rg "pattern" .
Checkout 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 yang menggunakan automata terbatas, SIMD dan optimasi literal agresif untuk membuat pencarian sangat cepat.
Mendukung mengabaikan pola 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 kata parsial). -
-n
- Tampilkan garis pertandingan Anda. -
-C
/--context
(misalnya.-C5
)- Meningkatkan konteks, sehingga Anda melihat kode sekitarnya . -
--color=auto
- Mark Up Teks yang cocok . -
-H
- Menampilkan nama file di mana teks ditemukan. -
-c
- Menampilkan jumlah garis yang cocok. Dapat dikombinasikan dengan-H
.
Saya melakukan ini menggunakan xargs, perintah yang sangat diremehkan
find ./ -type f -print0 | xargs -0 grep 'string_you_are_looking_for'
temukan ./ memberi Anda daftar rekursif dari semua file dalam folder saat inikemudian Anda menyalurkannya ke xargs yang menjalankan perintah grep pada masing-masing file tersebut
Saya tahu ada banyak jawaban di sini, tetapi inilah alternatif jika Anda ingin menambahkan batasan lain saat mencari file:
find . -type f -exec grep --quiet string_to_look_for {} ';' -print
Ini bekerja karena grep
akan kembali 0 jika ditemukan hasilnya, 1 sebaliknya. Misalnya Anda dapat menemukan file 1 MB besar dan mengandung sesuatu:
find . -type f -exec grep --quiet string_to_look_for {} ';' -size 1M -print
Untuk beberapa persyaratan Anda mungkin ingin menggunakan bendera optimizer -O
yang ada di GNU grep.
Wildcard dengan ’ – include="*.Opsi C"`, @ user311346, terima kasih kepada @ Lekensteyn.
grep-RIn * Akan mencari dari direktori saat ini di semua file teks.
Tidak yakin bagaimana melakukan Pencarian Saya secara rekursif dalam pola file seperti*.C dengan hanya grep
Gunakan kombinasi find dan grep untuk mencari file secara rekursif untuk string di saat ini dan semua sub direktori. Periksa ini http://wilddiary.com/find-files-containing-my-text/