(Diadaptasi dari Bagaimana saya secara rekursif memahami arsip terkompresi? )
Instal AVFS , sistem file yang menyediakan akses transparan di dalam arsip. Pertama jalankan perintah ini sekali untuk mengatur tampilan sistem file mesin Anda di mana Anda dapat mengakses arsip seolah-olah itu adalah direktori:
mountavfs
Setelah ini, jika /path/to/archive.zip
merupakan arsip yang dikenali, maka ~/.avfs/path/to/archive.zip#
adalah direktori yang tampaknya mengandung isi arsip.
find ~/.avfs"$PWD" \( -name '*.7z' -o -name '*.zip' -o -name '*.tar.gz' -o -name '*.tgz' \) \
-exec sh -c '
find "$0#" -name "*vacation*.jpg"
' {} 'Test::Version' \;
Penjelasan:
- Pasang sistem file AVFS.
- Cari file arsip
~/.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).
Atau dalam zsh ≥4.3:
mountavfs
ls -l ~/.avfs$PWD/**/*.(7z|tgz|tar.gz|zip)(e\''
reply=($REPLY\#/**/*vacation*.jpg(.N))
'\')
Penjelasan:
~/.avfs$PWD/**/*.(7z|tgz|tar.gz|zip)
cocok dengan arsip dalam tampilan AVFS dari 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\#/**/*vacation*.jpg
cocok dengan *vacation*.jpg
file dalam arsip.
- The
N
gumpal kualifikasi membuat pola memperluas untuk daftar kosong jika tidak ada pertandingan.
Gilles 'SANGAT berhenti menjadi jahat'
sumber
Solusi saya yang biasa :
Contoh:
Resuls seperti:
Jika Anda hanya ingin file zip dengan hits di atasnya:
FILENAME di sini digunakan dua kali, sehingga Anda dapat menggunakan variabel.
Dengan find, Anda mungkin menggunakan PATH / TO / SEARCH
sumber
Solusi lain yang berfungsi adalah
zgrep
sumber
zgrep
itu? Itu tidak berfungsi dengan yang dikirim bersama GNUgzip
(/bin/zgrep: -r: option not supported
,zgrep (gzip) 1.6
)Keramahtamahan pengguna IMHO juga harus diperhatikan:
dan untuk tar (yang ini belum diuji ...)
sumber
unzip
Implementasi apa yang dapat menangani file 7z atau tar.gz?libarchive
'sbsdtar
dapat menangani sebagian besar dari mereka format file, sehingga Anda bisa melakukan:Yang dapat Anda sederhanakan (dan tingkatkan agar sesuai dengan kasus-tidak sensitif) dengan GNU
find
dengan:Itu tidak mencetak jalur arsip tempat
*vacation*jpg
file - file itu ditemukan. Untuk mencetak nama itu, Anda dapat mengganti baris terakhir dengan:yang memberikan output seperti:
Atau dengan
zsh
:Perhatikan bahwa ada sejumlah format file lain yang hanya
zip
atautgz
file dalam suka.jar
atau.docx
file. Anda dapat menambahkannya kefind
/zsh
pola pencarian Anda,bsdtar
tidak peduli tentang ekstensi (seperti pada, itu tidak bergantung pada ekstensi untuk menentukan jenis file).Perhatikan bahwa di
*vacation*.jpg
atas cocok dengan jalur anggota arsip lengkap, bukan hanya nama file, sehingga akan cocok padavacation.jpg
tetapi juga padavacation/2014/file.jpg
.Untuk mencocokkan hanya pada nama file, satu trik adalah dengan menggunakan mode ekstrak , gunakan
-s
(substitusi) yang menggunakan regexps denganp
bendera untuk mencetak nama file yang cocok dan kemudian pastikan tidak ada file yang diekstraksi, seperti:Perhatikan bahwa ini akan menampilkan daftar pada stderr dan menambahkan
>>
ke setiap baris. Dalam kasus apa punbsdtar
, seperti kebanyakantar
implementasi dapat memotong nama file pada layar jika mengandung beberapa karakter seperti baris baru atau garis miring terbalik (diterjemahkan sebagai\n
atau\\
).sumber