In mehreren Fällen sagen wir „Ich habe“ a.zip
, das sich in a/*
sich selbst entpackt.
Es gibt jedoch häufig Zip-Dateien, deren gesamter Inhalt in das aktuelle Verzeichnis gelangt. In diesem Fall muss ich manuell ein Verzeichnis erstellen a
und die Dateien dort entpacken.
Wenn ich aber grundsätzlich immer ein Verzeichnis erstelle und sich herausstellt, dass die Zip-Datei vom ersten Typ ist, sieht meine Struktur folgendermaßen aus: a/a/*
Sie ist nicht ideal.
Gibt es eine Möglichkeit zum Entpacken a.zip
in a/*
einen der beiden oben beschriebenen Typen, unabhängig vom Typ?
Antwort1
Versuche dies:
archive="archive.zip"
has_parent=$(unzip -l "$archive" | tail -n+4 | head -n-2 | awk '{split($NF,a,"/");print a[1]}' | sort -u | wc -l)
if test "$has_parent" -eq 1; then
unzip $archive
else
dir="./$(basename ${archive%%.zip})"
mkdir "$dir"
unzip -d "$dir" $archive
fi
Bei Verwendung zipinfo
können Sie $has_parent
die Zeile wie folgt zusammenfassen:
has_parent=$(zipinfo -1 "$archive" | awk '{split($NF,a,"/");print a[1]}' | sort -u | wc -l)
Die Idee ist einfach: Wenn sich mehrere Dateien auf der Stammebene des Archivs befinden, wird Ihr aktuelles Verzeichnis offensichtlich zerstört, wenn Sie es entpacken. Daher müssen Sie vorher ein übergeordnetes Verzeichnis erstellen und die Dateien dort entpacken. Andernfalls ist es in Ordnung, im aktuellen Verzeichnis zu entpacken, wenn alle Dateien im Archiv dasselbe übergeordnete Verzeichnis haben.
Antwort2
zipinfo
Zur Anzeige von Zip-Inhalten verwenden :
$ zipinfo -1 a.zip
Wenn Sie jedoch nach einer Antwort zur Automatisierung suchen, beantwortet dies Ihre Frage wahrscheinlich nicht.
Bearbeiten:Sie können jede Ausgabezeile zipinfo
auf einen Schrägstrich prüfen. Wenn das Zeichen in einer Zeile fehlt, wissen Sie, dass es sich im Stammverzeichnis der ZIP-Datei befindet.
Leider fällt mir nicht spontan ein, wie das genau geht. Ich bin nicht sicher, ob es funktioniert, aber hier ist ein ungetesteter Befehl:
$ MKROOT=0
$ for X in $(zipinfo -1 a.zip); do $(echo "${X}" | grep "/"); if test "$?" -gt "0"; then MKROOT=1; fi; done
$ if test "${MKROOT}" -gt "0"; then mkdir "a"; cd "a"; unzip "../a.zip"; else unzip "a.zip"; fi
Bearbeiten:Der Vorschlag von Mark Perryman ist wahrscheinlich besser. Mir ist gerade aufgefallen, dass mein Befehl prüft, ob Dateien in Unterordnern enthalten sind, aber nicht, ob alle im selben Stammordner enthalten sind.