Cara menggunakan perintah "grep" untuk menemukan teks termasuk subdirektori

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 itu grep 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 mengobati search term sebagai literal, bukan ekspresi reguler
  • -i lakukan pencarian case-sensitive
  • --color=always untuk memaksa warna bahkan ketika pipa melalui less. Untuk membuat less warna dukungan, Anda perlu menggunakan -r opsi:

    grep -Hrn search . | less -r
  • --exclude-dir=dir berguna untuk mengecualikan direktori seperti .svn dan .git.

Example output

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/