GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Verschachtelte for-Schleife

Mit einer Kombination aus bsdtar von libarchive und GNU tar , können Sie den Inhalt dieser verschachtelten Archive auflisten, ohne sie auf die Festplatte extrahieren zu müssen:

for f in *.zip; do
  bsdtar -cf - --include='*.zip' "@$f" | tar -xf - --to-command='bsdtar tvf -'
done

GNU tar kann Mitglieder von Archiven beim Extrahieren mit --to-command an Befehle weiterleiten unterstützt aber nur tar Archivformate.

bsdtar unterstützt alle Arten von Archivformaten außer tar Einsen (einschließlich zip Einsen), hat nicht das Äquivalent von GNU tar ist --to-command (AFAIK), kann aber Archivformate im laufenden Betrieb konvertieren.


Sie können dies nicht tun, ohne die obersten Dateien tatsächlich in einen Unterordner zu entpacken.

Etwa so:

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

Sie sollten wahrscheinlich überprüfen, ob ${n} bereits existiert und wenn ja, einen Fehler erzeugen. Sie können auch einen temporären Dateinamen für das Unterverzeichnis verwenden:

dir=`mktemp -d zip-files.XXXXXX`

Führen Sie dann cd "${dir}" aus und rm -rf "${dir}" einmal erledigt.

Aktualisierungen:

Die set -e wird verwendet, um sicherzustellen, dass das Skript stoppt, wenn etwas schief geht. Vor allem, wenn die mkdir -- "${m}" fehlschlägt, die cd -- "${m}" wird auch fehlschlagen und somit der cd .. würde Sie auf die falsche Verzeichnisebene bringen und dort ist der rm -rf -- "${n}" wird gefährlich.

Eine andere Möglichkeit, die cd .. zu machen Aussage sicherer ist es, sich dieses Verzeichnis vor dem for zu merken Schleife und verwende diesen Pfad wie folgt:

topdir=`pwd`
for ...
do
  ...
  cd "$topdir"   # instead of `cd ..`
  ...
done

So die rm -rf -- "${n}" funktioniert nur in $topdir .

Die Verwendung des temporären Verzeichnisses wird die Dinge auch viel sicherer machen, da auf diese Weise das Erstellen/Entfernen des Verzeichnisses wie erwartet funktioniert, unabhängig von den Dateinamen in der obersten ZIP-Datei.


Wenn GNU Parallel installiert ist:

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. Bash For Loop Guide und Beispiele

  2. Linux-Scripting:3 Anleitungen für While-Schleifen in Bash

  3. Profi-Tipp:For-, While- und Until-Schleifen

  4. Wie konfiguriere ich virt-manager für die Unterstützung verschachtelter Virtualisierung?

  5. Beispiele für Bash-For- und While-Schleifen

Bash-Scripting – For-Schleife mit Beispielen erklärt

Bash For-Schleifen mit Beispielen

Bash For Loop – Die praktischste Anleitung

Die for-Schleife in Shell-Skripten verstehen

Die Bash FOR-Schleife erklärt und vereinfacht

Bash-Skript für Schleife mit Beispielen erklärt