/ / Woher wissen, ob eine Zip-Datei einen Stammordner hat? - zip, unzip

Woher wissen, ob eine Zip-Datei einen Stammordner hat? - zip, unzip

Ich wurde regelmĂ€ĂŸig von zip-Dateien (Bibliotheken, Programme, ...) gequĂ€lt.

Manchmal bin ich vorsichtig und mache:

$ mkdir content && cd content
$ unzip ../library.zip
Archive: library.zip
creating: library/
inflating: library/foo.c
...
$ # Grumble...
$ mv library/* .
$ rmdir library

Irgendwann werde ich faul und mache es einfach ...

$ cd
$ unzip ../library.zip
Archive: library.zip
creating: config/
inflating: config/...
creating: lib/
creating: bin/
creating: ...
...
$ # Grumble...
$ mkdir library
$ mv config library
$ mv lib library
$ mv bin library
$ # ...

Gibt es eine universelle Möglichkeit, eine Zip-Datei zu entpacken, ohne in eines dieser Probleme zu geraten?

Antworten:

1 fĂŒr Antwort № 1

Vor dem Entpacken können Sie zunĂ€chst mit der Option -l entpacken, um zu ĂŒberprĂŒfen, ob sich alle komprimierten Dateien in einem gemeinsamen Ordner im Archiv befinden.


1 fĂŒr Antwort № 2

Ich stimme zu, dass das super nervig ist. Ich glaube unzip sollte es out of the box unterstĂŒtzen. Hier ist ein Skript, das die Arbeit erledigt (ich nenne es unzipd).

#!/usr/bin/env bash

# Exit on any error
set -e

# Check we have at least one argument
if [ $# -ne 1 ]; then
echo "Missing zip filename parameter"
exit 2
fi

zip="$1"
# Get filename only (no path)
zipfile=${zip##*/}
# Get file base namem (no extension)
zipbase=${zipfile%%.*}

# Make a tmp dir in the current dir
tmpdir=$(mktemp -d -p . -t "$zipbase.XXXX")

# Unzip into the tmp directory
/usr/bin/unzip -d "$tmpdir" ${@:1:$(($#-1))} "$zip"

# Check number of files in the tmp dir
if [ "$(ls -1 "$tmpdir" | wc -l)" -eq 1 ]; then
# If there"s only 1 file in the tmp, move it up a level
mv "$tmpdir"/* .
# Get rid of tmp dir
rmdir "$tmpdir"
else
# If more then 1 file, just rename the tmp dir based on the zip filename
mv "$tmpdir" "$zipbase"
fi