Ok, mari kita terapkan filosofi unix. Apa komponen dari 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 beroperasi dengan mudah pada komponen arsip, 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 sebagian besar format file arsip.
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 dicari).
$0#
adalah tampilan direktori arsip $0
.
{\}
daripada {}
diperlukan jika find
pengganti luar {}
dalam -exec ;
argumen (beberapa melakukannya, beberapa tidak).
- Opsional: akhirnya unmount sistem file AVFS.
Atau dalam 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)
cocok dengan arsip dalam tampilan AVFS direktori saat ini dan subdirektori.
PATTERN(e\''CODE'\')
berlaku 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.
- The
N
gumpal kualifikasi membuat pola memperluas untuk daftar kosong jika tidak ada pertandingan.