Bagaimana cara saya menerima string secara rekursif melalui semua .gz
file di semua direktori dan subdirektori?
8
@Steve Weet hampir tiba. Penggunaan / dev / null sebagai argumen tambahan adalah cara yang bagus untuk memaksa nama file ditampilkan (saya akan ingat itu, terima kasih Steve) tetapi masih menjalankan exec untuk setiap file yang ditemukan - overhead yang besar.
Anda ingin menjalankan zgrep sesering mungkin, dapatkan hasil maksimal dari setiap eksekusi:
find . -iname '*.gz' -print0 | xargs -0 zgrep PATTERN
xargs
akan menyediakan sebanyak mungkin args (nama file) ke zgrep, dan berulang kali jalankan sampai ia menggunakan semua file yang disediakan oleh find
perintah. Menggunakan -print0
dan -0
opsi memungkinkan untuk bekerja jika ada spasi di salah satu file atau nama direktori.
Di Mac OS X, Anda dapat mencapai efek yang sama tanpa xargs:
find . -iname '*.gz' -exec zgrep PATTERN {} +
-H
untuk selalu menampilkan nama file dengan baris yang cocok, setidaknya di GNU grep.Jadi sesuatu seperti itu
sumber
zgrep -r
untuk pergi melalui pohon atau jika -r tidak bekerja, pipa output darixargs zgrep
/bin/zgrep: -r: option not supported
sistem ubuntu saya yang baru diinstal.xargs
sebagai gantinya.@aioobe hampir sampai. Perintah akan melakukan pekerjaan tetapi tidak akan memberi tahu Anda nama file
Yang berikut juga harus memberi tahu Anda nama file:
Penambahan
/dev/null
akan memastikan bahwa zgrep melihat dua nama file sehingga akan menunjukkan kepada Anda nama file jika menemukan stringEDIT
Penelitian lebih lanjut mengungkapkan bahwa untuk mesin saya (OS / X)
-exec
argumen untuk menemukan akan menambahkan sebanyak mungkin nama file (mirip dengan caraxargs
berperilaku).sumber
-exec
- saya semua tentang portabilitas jadi saya tidak akan menggunakannya dalam skrip, tetapi bagus untuk command prompt.find
, tetapi sebagian besar versi modern (misalnya dalam distro berbasis Debian).-H
untuk selalu menampilkan nama file dengan baris yang cocok, setidaknya di GNU grep, alih-alih/dev/null
peretasan.Berikut ini adalah suguhan di
zsh
Hal ini juga dapat bekerja di
bash
,ksh
, dll ...sumber