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?

Owen
sumber
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)" .
bear24rw
sumber
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/

Raoul
sumber
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)'
Michael Berkowski
sumber
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 {} \;
Fredrik Pihl
sumber
+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'
tidak
sumber
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).

Pedro Vernetti
sumber