GNU/Linux >> Belajar Linux >  >> Linux

Bersarang untuk loop

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

Linux
  1. Skrip Linux:3 cara untuk while loop di Bash

  2. Sejajarkan Bash Untuk Loop?

  3. Untuk Loop Dengan Nama File?

  1. Panduan Bash For Loop dan Contohnya

  2. Contoh Bash For Loop dan While Loop

  3. Contoh Bash untuk loop

  1. Kiat Pro:Untuk, Sementara, dan Hingga Perulangan

  2. Bagaimana Mengkonfigurasi virt-manager untuk Dukungan Virtualisasi Bersarang?

  3. Menjalankan perintah terminal loop di Jupyter