Dengan kombinasi bsdtar libarchive dan GNU tar , Anda dapat membuat daftar konten arsip bersarang tersebut tanpa harus mengekstraknya di disk:
for f in *.zip; do
bsdtar -cf - --include='*.zip' "@$f" | tar -xf - --to-command='bsdtar tvf -'
done
GNU tar dapat menyalurkan anggota arsip ke perintah setelah ekstraksi dengan --to-command tetapi hanya mendukung tar format arsip.
bsdtar mendukung semua jenis format arsip selain tar yang (termasuk zip one), tidak memiliki persamaan dengan GNU tar --to-command (AFAIK), tetapi dapat mengonversi format arsip dengan cepat.
Anda tidak dapat melakukannya tanpa benar-benar membuka ritsleting file teratas dalam subfolder.
Sesuatu seperti ini:
set -e
for f in *.zip
do
n=`basename -- "${f}" .zip`
mkdir -- "${n}"
cd -- "${n}"
unzip ../"${f}"
for p in *.zip
do
unzip -l -- "${p}"
done
cd ..
rm -rf -- "${n}"
done
Anda mungkin harus memverifikasi apakah ${n} sudah ada dan jika demikian menghasilkan kesalahan. Anda juga dapat menggunakan nama file sementara untuk sub-direktori:
dir=`mktemp -d zip-files.XXXXXX`
Kemudian lakukan cd "${dir}" dan rm -rf "${dir}" setelah selesai.
Pembaruan:
set -e digunakan untuk memastikan bahwa jika terjadi kesalahan maka skrip berhenti. Terutama, jika mkdir -- "${m}" gagal, cd -- "${m}" akan gagal juga dan dengan demikian cd .. akan membawa Anda ke tingkat direktori yang salah dan di situlah rm -rf -- "${n}" menjadi berbahaya.
Cara lain untuk membuat cd .. pernyataan lebih aman adalah mengingat direktori tersebut sebelum for loop dan gunakan jalur itu seperti:
topdir=`pwd`
for ...
do
...
cd "$topdir" # instead of `cd ..`
...
done
Dengan begitu rm -rf -- "${n}" hanya akan beroperasi di $topdir .
Penggunaan direktori sementara juga akan membuat segalanya jauh lebih aman karena dengan cara itu, apa pun nama file di file zip teratas, pembuatan/penghapusan direktori akan berfungsi seperti yang diharapkan.
Jika GNU Parallel diinstal:
extract_list() {
mkdir "$1"
cd "$1"
unzip ../"$1".zip
parallel unzip -l ::: *.zip
cd ..
rm -rf "$1"
}
export -f extract_list
parallel extract_list {.} ::: *.zip