Entpacken Sie den Inhalt der Datei, ohne jedoch einen Archivordner zu erstellen

37

Ich habe eine Datei myarchive.zip, die viele Verzeichnisse, Dateien usw. enthält. Nehmen wir an, diese Datei myarchive.zip befindet sich in einem Verzeichnis mit dem Namen "b". Wenn ich den Befehl "unzip myarchive.zip" verwende, erstellt das System standardmäßig ein Verzeichnis mit dem Namen "myarchive" mit dem Inhalt der ZIP-Datei. Ich möchte nicht, dass das System dieses "myarchive" -Verzeichnis erstellt - ich möchte nur, dass der Inhalt in das Verzeichnis "b" extrahiert wird. Ist das möglich?

Was ich jetzt mache, ist einfach ein "cp" -Befehl, um die Dateien aus dem neu erstellten Verzeichnis (in diesem Fall "myarchive" nach "b") zu kopieren, wo ich sie haben möchte.

ScoobaSteve
quelle
8
Standardmäßig unzipwird kein Verzeichnis erstellt. In Ihrer ZIP-Datei befindet sich das Verzeichnis wahrscheinlich auf der obersten Ebene.
Chris Down
3
Sie könnten mvanstelle von verwenden cp. mv archive/* .; rmdir archive/o.ä.
Frostschutz

Antworten:

45

Meine Version von unziphat die -jOption, kein Verzeichnis zu erstellen.

Damit

unzip -j /path/to/file.zip

Extrahiert alle Dateien in das aktuelle Verzeichnis, ohne die in der zipDatei gespeicherte Verzeichnisstruktur wiederherzustellen .

Wenn Sie nur eine Verzeichnisebene aus dem Archiv entfernen möchten (extrahieren myarchive/dir/fileals dir/file, nicht file), können Sie stattdessen die Option bsdtar(die zipDateien zusätzlich zu tarDateien unterstützt) verwenden -s.

bsdtar -xf /path/to/file.zip -s'|[^/]*/||'
Stéphane Chazelas
quelle
8
Bei Verwendung -jdes Archivs wird die Verzeichnisstruktur nicht neu erstellt und alle Dateien werden im Extraktionsordner abgelegt. Dies bedeutet, dass ALLE Unterordner gelöscht werden. Also , wenn Sie hätte zip/A/f1, zip/A/B/f2und zip/A/B/C/f3Sie würden mit einem einzigen Ordner mit f1 am Ende, f2, f3. Es wird unkonventionell, wenn Sie Dateien mit demselben Namen in verschiedenen Unterordnern haben. Normalerweise möchten Sie nur den obersten Ordner ablegen, nicht die gesamte Verzeichnisstruktur.
Cristian Vrabie
3
@CristianVrabie, genau das sage ich in der Antwort. Ich habe eine Bsdtar-Alternative für das, was Sie fragen, hinzugefügt. Siehe Bearbeiten.
Stéphane Chazelas
3

Mit bsdtar sieht das ganz einfach aus :

bsdtar --strip-components=1 -xvf file.zip

ismail
quelle
1

Was die akzeptierte Antwort nicht angibt, wie Sie in der Frage sagen, wenn Sie dennoch in einen bestimmten Ordner extrahieren möchten, ohne die in den ZIP-Dateien gespeicherten Ordnerpfade zu verwenden, können Sie die -jOption mit -dOption auf diese Weise verwenden :

unzip -j /path/to/file.zip -d other_folder

oder für Ihren Fall

unzip -j myarchive.zip -d b
Eduard Florinescu
quelle
2
Du hast recht, dass du das kannst; Die Unterverzeichnisse werden jedoch nicht erstellt, sodass Sie noch einen weiteren Schritt ausführen müssen. Ich bin mir ziemlich sicher, dass das OP das Stammverzeichnis des Archivs in einen anderen Namen umbenennen möchte, aber die verbleibende Struktur unter diesem Verzeichnis behalten möchte.
Pryftan,
-1

Wenn beim Ausführen unzip myarchive.zipein Verzeichnis erstellt wird, myarchivein dem sich alles befindet, bedeutet dies, dass der Ersteller der ZIP-Datei tatsächlich das ZIP-Verfahren für dieses Verzeichnis ausgeführt hat.

Die einzige Möglichkeit, das zu erstellen, was Sie möchten, besteht darin, den gesamten Inhalt nach der Ausführung aus dem Verzeichnis zu verschieben unzip:

[user@host]:some/path/b$ unzip myarchive.zip

[user@host]:some/path/b$ ls{ zeigt Verzeichnismyarchive }

[user@host]:some/path/b$ mv myarchive/* .

[user@host]:some/path/b$ rm -R myarchive

[user@host]:some/path/b$ ls{ zeigt die erste Ebene von myarchive (direkt in b) }

Toinetoine
quelle
1
Sie benötigen außerdem ein mv myarchive/.* ., um alle versteckten Dateien wie .gitignore und .htaccess zu verschieben.
Kinjal Dixit
1
@KinjalDixit Das war auch mein Gedanke; Antoine, in Ihrem Beispiel gibt es einen schwerwiegenden Fehler, wie Kinjai hervorhebt: Weil Sie verwenden rm -Rund weil Sie nicht verwenden ls -a, wird nicht angezeigt, ob Punktedateien vorhanden sind. Was passiert nun, wenn Sie ausgeführt werden rm -Rund Punktedateien vorhanden sind? Sie haben sie nicht kopiert, damit sie verloren gehen. Sie sollten das wirklich beheben und vielleicht den Unterschied erklären, weil es etwas ist, das Neulinge ziemlich oft stören wird; und überlege: was ist, wenn es sich nicht um ein Archiv handelt? Oder was ist, wenn sie den Befehl zum Löschen des Archivs ergänzen, sobald es dekomprimiert ist?
Pryftan,
Otoh rmdirwürde sicherstellen, dass es zuerst leer ist ... Aber wenn der Benutzer nichts über Punktedateien weiß, würde es sie verwirren.
Pryftan,