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.
unzip
wird kein Verzeichnis erstellt. In Ihrer ZIP-Datei befindet sich das Verzeichnis wahrscheinlich auf der obersten Ebene.mv
anstelle von verwendencp
.mv archive/* .; rmdir archive/
o.ä.Antworten:
Meine Version von
unzip
hat die-j
Option, kein Verzeichnis zu erstellen.Damit
Extrahiert alle Dateien in das aktuelle Verzeichnis, ohne die in der
zip
Datei gespeicherte Verzeichnisstruktur wiederherzustellen .Wenn Sie nur eine Verzeichnisebene aus dem Archiv entfernen möchten (extrahieren
myarchive/dir/file
alsdir/file
, nichtfile
), können Sie stattdessen die Optionbsdtar
(diezip
Dateien zusätzlich zutar
Dateien unterstützt) verwenden-s
.quelle
-j
des 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ättezip/A/f1
,zip/A/B/f2
undzip/A/B/C/f3
Sie 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.Mit bsdtar sieht das ganz einfach aus :
bsdtar --strip-components=1 -xvf file.zip
quelle
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
-j
Option mit-d
Option auf diese Weise verwenden :oder für Ihren Fall
quelle
Wenn beim Ausführen
unzip myarchive.zip
ein Verzeichnis erstellt wird,myarchive
in 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 inb
) }quelle
mv myarchive/.* .
, um alle versteckten Dateien wie .gitignore und .htaccess zu verschieben.rm -R
und weil Sie nicht verwendenls -a
, wird nicht angezeigt, ob Punktedateien vorhanden sind. Was passiert nun, wenn Sie ausgeführt werdenrm -R
und 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?rmdir
würde sicherstellen, dass es zuerst leer ist ... Aber wenn der Benutzer nichts über Punktedateien weiß, würde es sie verwirren.