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 luarfind
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
. Mengaturreply
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.