Ich habe ein Skript, das eine tar.gz-Datei in ein bestimmtes Unterverzeichnis mysubfolder extrahiert :
mkdir mysubfolder; tar --extract --file=sourcefile.tar.gz --strip-components=1 --directory=mysubfolder;
Gibt es eine äquivalente Möglichkeit, dies mit einer Zip-Datei zu tun?
Antworten:
Wie Mathias sagte,
unzip
gibt es keine solche Option, aber ein einzeiliges Bash-Skript kann den Job erledigen.Das Problem ist: Der beste Ansatz hängt von Ihrem Archivlayout ab. Eine Lösung , die übernimmt ein einziges Top-Level - dir kläglich scheitert , wenn der Inhalt direkt in das Archiv Wurzel ist (man denke etwa
/a/foo
/b/foo
/foo
und das Chaos der Stripping/a
und/b
).Und das gleiche Scheitern passiert mit
tar --strip-component
. Es gibt keine Einheitslösung.Also, um das Wurzelverzeichnis zu entfernen, vorausgesetzt, es gibt eins (und nur eins):
Stellen Sie einfach sicher, dass Dateien / Verzeichnisse der zweiten Ebene nicht den gleichen Namen wie die übergeordneten Dateien der obersten Ebene haben (z. B.
/foo/foo
). Aber/foo/bar/foo
und/foo/bar/bar
sind ok Wenn dies der Fall ist oder Sie nur auf Nummer sicher gehen möchten, können Sie ein temporäres Verzeichnis zum Extrahieren verwenden:Wenn Sie Bash verwenden, können Sie testen, ob die oberste Ebene ein einzelnes Verzeichnis ist oder nicht:
Apropos Bash, Sie sollten es aktivieren
dotglob
, um versteckte Dateien einzuschließen, und Sie können alles in einer einzigen, praktischen Funktion zusammenfassen:Geben Sie das jetzt in Ihr
~/.bashrc
oder ein,~/.profile
und Sie müssen sich nie wieder darum kümmern. Verwenden Sie einfach als:(Beachten Sie, dass es automatisch
mysubfolder
für Sie erstellt wird, wenn es nicht existiert.)quelle
Ich habe eine solche Option in den Manualseiten für nicht gefunden
unzip
, daher fürchte ich, dass dies unmöglich ist. :(Sie können dies jedoch (je nach Situation) umgehen. Wenn Sie beispielsweise sicher sind, dass das einzige Verzeichnis der obersten Ebene in der ZIP-Datei mit dem Namen
foo-
gefolgt von einer Versionsnummer versehen ist, können Sie Folgendes tun:quelle
rm -rf foo-*
absichtlich hinzugefügt , da dies möglicherweise gefährlich ist. Was ist, wenn es bereits einen Ordner mit dem Namen gabfoo-bar
? Beachten Sie, dass die Extraktion in dem/tmp
Ordner durchgeführt wird, der von Zeit zu Zeit automatisch geleert wird.&&
: Ein bestimmter Schritt wird nur ausgeführt, wenn der vorherige erfolgreich war. Der letzte Schritt wird alsorm
nur ausgeführt, wenn alle Schritte ohne Fehler abgeschlossen wurden./tmp/some-hardcoded-folder-name
einen temporären Ordner verwenden sollte, sondern stattdessenmktemp
: Es ist garantiert, dass es keinen solchen Ordner gibt. Überprüfen Sie meine Antwort unten.Sie können verwenden,
-j
um Pfade zu verschrotten (keine Verzeichnisse zu erstellen). Dies wird nur für einige gängige einstufige Archive empfohlen. Archive mit mehrstufigen Verzeichnisstrukturen werden reduziert - dies kann sogar zu Namenskonflikten für die zu extrahierenden Dateien führen.Aus der Manpage von unzip:
quelle