Temukan file yang berisi teks yang diberikan


153

Dalam bash saya ingin mengembalikan nama file (dan path ke file) untuk setiap file tipe yang .php|.html|.jsberisi string case-insensitive"document.cookie" | "setcookie"

Bagaimana saya melakukannya?


4
Sudahkah Anda mempertimbangkan hanya menggunakan grep? cyberciti.biz/faq/grep-in-bash
Terrance

Judul ini cukup menyesatkan. "find-files-mengandung-a-diberikan-teks"
Josh C

Jawaban:


212
egrep -ir --include=*.{php,html,js} "(document.cookie|setcookie)" .

The rbendera berarti untuk mencari rekursif (mencari subdirektori). The ibendera berarti kasus tidak sensitif.

Jika Anda hanya ingin nama file tambahkan bendera l(huruf kecil L):

egrep -lir --include=*.{php,html,js} "(document.cookie|setcookie)" .

yang sepertinya tidak bekerja untuk saya (setidaknya tidak pada mac) .... hanya hang ... egrep -lir --include = * "repo" egrep: peringatan: pencarian rekursif stdin
Dean Hiller

13
Anda lupa menambahkan jalur untuk mencari. Jalannya adalah '.' dalam contoh di atas. Dalam kasus Anda, skrip sedang menunggu input untuk mencari di stdin. Coba: egrep -lir --include = * "repo" / (atau jalur lain)
LodeRunner

1
grep -E ... >egrep ...
Aman

Saya mendapat kesalahan grep: (error|fail): No such file or directorydi Ubuntu Desktop 16; ada petunjuk?
Nam G VU

Agar saya berfungsi, saya harus melewatkan * dengan \. jadi saya punya--include=\*.{php,html,js}
Mehrad Mahmoudian

53

Coba sesuatu seperti grep -r -n -i --include="*.html *.php *.js" searchstrinhere .

yang -imembuatnya case insensitlve

yang .pada sarana akhir Anda ingin memulai dari direktori Anda saat ini, ini bisa diganti dengan direktori apapun.

yang -rberarti melakukan ini secara rekursif, sampai pohon direktori

yang -nmencetak nomor baris untuk pertandingan.

yang --includememungkinkan Anda menambahkan nama file, ekstensi. Wildcard diterima

Untuk info lebih lanjut, lihat: http://www.gnu.org/software/grep/


4
Atau mungkin gunakan -lopsi (cukup cetak nama file yang cocok) alih-alih-n
glenn jackman

15

findmereka dan grepuntuk string:

Ini akan menemukan semua file dari 3 jenis Anda di / starting / path dan grep untuk ekspresi reguler '(document\.cookie|setcookie)'. Membagi menjadi 2 baris dengan garis miring terbalik hanya untuk keterbacaan ...

find /starting/path -type f -name "*.php" -o -name "*.html" -o -name "*.js" | \
 xargs egrep -i '(document\.cookie|setcookie)'

1
Seperti penggunaan universal find, tetapi menurut saya lebih baik menggunakan-exec grep -l 'sth' {} \;
NGix

Terima kasih @Michael Berkowski Cara ini tercepat lebih dari 5 atau 8 kali # egrep -ir --include=file.foo "(foo|bar)" /dirpada direktori weigth ~ 500Gb.
Qh0stM4N

9

Kedengarannya seperti pekerjaan yang sempurna untuk grepatau mungkin ack

Atau konstruksi yang luar biasa ini:

find . -type f \( -name *.php -o -name *.html -o -name *.js \) -exec grep "document.cookie\|setcookie" /dev/null {} \;

+1 Menggunakan -exec grep...lebih baik daripada xargsmetode saya karena tidak akan tersedak spasi dalam nama file.
Michael Berkowski

@MichaelBerkowski: Anda dapat menggunakannya seperti ini untuk menangani spasi dalam nama file: find . -type f -print0 | xargs -0 -I {} grep "search_string" {}. Tentu saja, opsi lain dapat ditambahkan juga.
Pascal

4
find . -type f -name '*php' -o -name '*js' -o -name '*html' |\
xargs grep -liE 'document\.cookie|setcookie'

3

Hanya dengan memasukkan satu alternatif lagi, Anda juga dapat menggunakan ini:

find "/starting/path" -type f -regextype posix-extended -regex "^.*\.(php|html|js)$" -exec grep -EH '(document\.cookie|setcookie)' {} \;

Dimana:

  • -regextype posix-extendedmemberitahu findregex seperti apa yang diharapkan
  • -regex "^.*\.(php|html|js)$"memberitahu findregex itu sendiri nama file harus cocok
  • -exec grep -EH '(document\.cookie|setcookie)' {} \;memberitahu finduntuk menjalankan perintah (dengan opsi dan argumennya) yang ditentukan antara -execopsi dan \;untuk setiap file yang ditemukannya, di mana {}mewakili tempat path file masuk dalam perintah ini.

    sementara

    • Eopsi memberitahu grepuntuk menggunakan regex diperpanjang (untuk mendukung tanda kurung) dan ...
    • HOpsi memberitahu grepuntuk mencetak jalur file sebelum pertandingan.

Dan, mengingat ini, jika Anda hanya menginginkan jalur file, Anda dapat menggunakan:

find "/starting/path" -type f -regextype posix-extended -regex "^.*\.(php|html|js)$" -exec grep -EH '(document\.cookie|setcookie)' {} \; | sed -r 's/(^.*):.*$/\1/' | sort -u

Dimana

  • |[pipa] kirim output dari findke perintah selanjutnya setelah ini (yaitu sed, lalu sort)
  • rOpsi memberitahu seduntuk menggunakan regex diperpanjang.
  • s/HI/BYE/memberitahu seduntuk mengganti setiap kemunculan Pertama (per baris) "HI" dengan "BYE" dan ...
  • s/(^.*):.*$/\1/memintanya untuk mengganti regex (^.*):.*$(artinya grup [barang terlampir oleh ()] termasuk semua [ .*= satu atau lebih karakter apa saja] dari awal baris [ ^] hingga 'yang pertama': 'diikuti oleh apa saja hingga' akhir dari baris [ $]) oleh grup pertama [ \1] dari regex yang diganti.
  • umemberi tahu sortir untuk menghapus entri duplikat (ambil sort -usebagai opsional).

... JAUH dari cara yang paling elegan. Seperti yang saya katakan, maksud saya adalah untuk meningkatkan berbagai kemungkinan (dan juga untuk memberikan penjelasan yang lebih lengkap tentang beberapa alat yang dapat Anda gunakan).

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.