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