Bagaimana cara saya menerima string secara rekursif melalui semua .gz
file di semua direktori dan subdirektori?
Bagaimana cara saya menerima string secara rekursif melalui semua .gz
file di semua direktori dan subdirektori?
Jawaban:
@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.
$ zgrep --help
Usage: /bin/zgrep [OPTION]... [-e] PATTERN [FILE]...
Look for instances of PATTERN in the input FILEs, using their
uncompressed contents if they are compressed.
Jadi sesuatu seperti itu
find . -iname "*.gz" -exec zgrep PATTERN {} \
zgrep -r
untuk pergi melalui pohon atau jika -r tidak bekerja, pipa output dari xargs 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:
find . -iname "*.gz" -exec zgrep PATTERN {} /dev/null \;
Penambahan /dev/null
akan memastikan bahwa zgrep melihat dua nama file sehingga akan menunjukkan kepada Anda nama file jika menemukan string
EDIT
Penelitian lebih lanjut mengungkapkan bahwa untuk mesin saya (OS / X) -exec
argumen untuk menemukan akan menambahkan sebanyak mungkin nama file (mirip dengan cara xargs
berperilaku).
-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.