So erkennen Sie im Voraus, ob eine ZIP-Datei ein übergeordnetes Verzeichnis enthält

So erkennen Sie im Voraus, ob eine ZIP-Datei ein übergeordnetes Verzeichnis enthält

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 aund 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.zipin 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 zipinfokönnen Sie $has_parentdie 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

zipinfoZur 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 zipinfoauf 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.

verwandte Informationen