GNU/Linux >> Belajar Linux >  >> Linux

Bagaimana Cara Grep Secara Rekursif Melalui Arsip Terkompresi?

Saya mencoba mencari tahu modul apa yang use Test::Version di cpan. Jadi saya menggunakan minicpan untuk mencerminkannya. Masalah saya adalah saya perlu mengulangi arsip yang diunduh, dan mengambil file yang ada di arsip. Adakah yang bisa memberi tahu saya bagaimana saya bisa melakukan ini? sebaiknya dengan cara yang memberi tahu saya file mana yang ada di arsip dan di baris mana file itu berada.

(catatan:tidak semuanya tarball, beberapa adalah file zip)

Jawaban yang Diterima:

Oke, mari kita terapkan filosofi unix. Apa saja komponen tugas ini?

  • Pencarian teks:Anda memerlukan alat untuk mencari teks dalam file, seperti grep .
  • Rekursif:Anda memerlukan alat untuk mencari file di pohon direktori, seperti find .
  • Arsip:Anda memerlukan alat untuk membacanya.

Sebagian besar program unix beroperasi pada file. Jadi untuk mengoperasikan komponen arsip dengan mudah, Anda perlu mengaksesnya sebagai file, dengan kata lain Anda perlu mengaksesnya sebagai direktori.

Sistem file AVFS menyajikan tampilan sistem file tempat setiap file arsip /path/to/foo.zip dapat diakses sebagai direktori ~/.avfs/path/to/foo/zip# . AVFS menyediakan akses hanya baca ke format file arsip yang paling umum.

mountavfs
find ~/.avfs"$PWD" ( -name '*.zip' -o -name '*.tar.gz' -o -name '*.tgz' ) 
     -exec sh -c '
                  find "$0#" -name "*.pm" -exec grep "$1" {} +
                 ' {} 'Test::Version' ;
fusermount -u ~/.avfs   # optional

Penjelasan:

  • Pasang sistem file AVFS.
  • Cari file arsip di ~/.avfs$PWD , yang merupakan tampilan AVFS dari direktori saat ini.
  • Untuk setiap arsip, jalankan cuplikan shell yang ditentukan (dengan $0 =nama arsip dan $1 =pola untuk mencari).
  • $0# adalah tampilan direktori arsip $0 .
  • {} daripada {} diperlukan jika bagian luar find menggantikan {} di dalam -exec ; argumen (ada yang melakukannya, ada yang tidak).
  • Opsional:akhirnya unmount sistem file AVFS.

Atau di zsh 4.3:

mountavfs
grep 'Test::Version' ~/.avfs$PWD/**/*.(tgz|tar.gz|zip)(e''
     reply=($REPLY#/**/*.pm(.N))
'')

Penjelasan:

  • ~/.avfs$PWD/**/*.(tgz|tar.gz|zip) mencocokkan arsip dalam tampilan AVFS dari direktori saat ini dan subdirektorinya.
  • PATTERN(e''CODE'') menerapkan KODE untuk setiap kecocokan POLA. Nama file yang cocok ada di $REPLY . Mengatur reply array mengubah kecocokan menjadi daftar nama.
  • $REPLY# adalah tampilan direktori arsip.
  • $REPLY#/**/*.pm cocok dengan .pm file dalam arsip.
  • N glob qualifier membuat pola diperluas ke daftar kosong jika tidak ada kecocokan.
Terkait:Bagaimana cara memeriksa sinyal apa yang sedang didengarkan oleh suatu proses?
Linux
  1. Grep Bagaimana Cara Menekan Tampilan File yang Tidak Cocok?

  2. Bagaimana Menemukan Banyak String Dalam File??

  3. Contoh cpio Linux:Cara Membuat dan Mengekstrak Arsip cpio (dan arsip tar)

  1. Cara membalikkan ekspresi grep

  2. Bagaimana cara 'menangkap' aliran berkelanjutan?

  3. Cara grep keluaran ps dengan header

  1. Cara menggunakan perintah grep Linux

  2. Cara Mengarsipkan dan Mengompresi File di Linux

  3. Bagaimana Cara Grep Dalam File Pdf?