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