Abhängig davon, wie eine Zip-Datei erstellt wird, werden manchmal alle Dateien direkt extrahiert, und manchmal werden die Dateien in ein Unterverzeichnis extrahiert.
Wenn letzteres zutrifft, wie kann ich den unzip
Befehl erzwingen , dieses Verzeichnis der ersten Ebene zu "ignorieren"?
Beispiel:
cd /tmp
wget http://omeka.org/files/omeka-1.5.1.zip
mkdir omeka
unzip omeka-1.5.1.zip -d omeka/
cd omeka/
ll
Was ich bekomme ist /tmp/omeka/omeka-1.5.1/
:
total 12
drwxr-xr-x 3 root root 4096 2012-05-08 18:44 ./
drwxrwxrwt 6 root root 4096 2012-05-08 18:44 ../
drwxr-xr-x 5 root root 4096 2012-04-20 14:54 omeka-1.5.1/
Was ich will, ist von den Dateien extrahiert /tmp/omeka/
, (eine Ebene höher und keine Versionsnummer in der Verzeichnisstruktur enthalten)
/tmp/omeka/(files)
Ich weiß, dass ich die -j
Option "Junk-Pfade" verwenden kann, aber ich möchte die Unterverzeichnisstruktur beibehalten, nur nicht die Verzeichnisstruktur der obersten Ebene. Wie kann ich das machen?
mv
die Dateien extrahieren und dann , aber ich wollte sehen, ob es eine Möglichkeit gibt, dies direkt mit dem Befehl/wordpress/
Verzeichnis (keine Versionsnummer) in der Zip-Datei legt . Es ist in der Tat in Ordnungunzip
und dann,mv
aber keine Kontrolle darüber zu haben und es in zwei Schritten tun zu müssen, hat mich immer ein wenig auf die Nerven gebracht. Zum Glück kommt Wordpress auch in einer.tar.gz
Geschmacksrichtung :)cd /tmp/omeka && ln -s -T . omeka-1.5.1
Antworten:
Verwenden Sie ein FUSE- Dateisystem, mit dem Sie Archive wie Verzeichnisse wie AVFS durchsuchen können . Verwenden Sie
cp
diese Option, um die Dateien in ein Verzeichnis Ihrer Wahl zu extrahieren.Da wir davon ausgehen, dass sich im Archiv ein einzelnes Verzeichnis auf oberster Ebene befindet, können Sie dieses auf kürzen
quelle
unzip
etwas Magie zu haben, um dies zu tun, wie zum Beispiel die Angabe der zu extrahierenden Dateien*/*
, die ich verwenden könnte, ohne ein anderes Dienstprogramm zu installieren, aber ich denke nicht. Vielen Dank. +1Wenn Ihre Zip-Datei keine Verzeichnisstruktur enthält oder Sie sie nicht beibehalten müssen, können Sie dies verwenden:
quelle
Dieses Skript ist nicht robust, funktioniert aber in einfachen Fällen:
Es wird nur geprüft, ob es genau ein Unterverzeichnis gibt. Wenn dies der Fall ist, wird alles nach oben verschoben und dann gelöscht.
quelle
Ich habe mich gerade registriert, kann also die Antwort von @SteveBennet nicht positiv bewerten und dort keinen Kommentar hinzufügen.
Basierend auf seiner Antwort habe ich eine rekursive Funktion wie diese erstellt:
Genau wie @SteveBennet sagte: Dieses Skript ist nicht robust, funktioniert aber in den einfachen Fällen.
Hoffe es ist nützlich.
quelle
Notwendigkeit sieht nach
patch --strip=n
Option ausEs wäre wünschenswert, eine Option wie
patch --strip=number
(oder-pnumber
) zu haben, dienumber
Pfadkomponenten am Anfang zerlegt (siehe Vergleichen und Zusammenführen von Dateien: Patch-Verzeichnisse ).Andere Lösung, Anwendbarkeit
Gelingt dies nicht, gibt es eine andere Lösung, die irgendwie hackisch ist, aber funktioniert. In meinem Fall wollte ich ein Verzeichnis mit vorhandenen Dateien mit dem Inhalt einer Zip-Datei überschreiben, ohne zuerst die vollständige Zip-Datei zu extrahieren.
Wenn diese Lösung funktioniert und die Lösung von @ Gilles verfügbar ist, funktioniert auch diese. Für diese Lösung ist jedoch kein FUSE-Dateisystem erforderlich.
Wie es geht
Vorausgesetzt, Sie kennen das zusätzliche Verzeichnis. In diesem Fall
omeka-1.5.1
können Sie dies tun:unzip
versuche zu entpacken zuomeka-1.5.1
dem eigentlich ein symlink zu dir gehört. Infolgedessen landen Dateienomeka
direkt in.Mögliche Varianten
Sie können sich Varianten vorstellen, um einen oder mehrere Teile einer Depeer-Hierarchie umzuleiten.
Fazit
Diese Lösung ist etwas spezifisch, hat aber ihre Anwendungsfälle und ich habe sie gerade benutzt.
quelle
unzip -l
. B. mit . Dies könnte sogar mithilfe eines Skripts automatisiert werden, das einen Teil des üblichen Pfads ermittelt.zipinfo -1
könnte ein guter Anfang sein. Was ist Ihr Anwendungsfall?Höchstwahrscheinlich möchten Sie
unzip
mit der-j
Option ausgeführt werden, wie in:Aber Sie könnten von seinem Verhalten überrascht sein:
Wenn Sie
files.zip
im Ausgabeverzeichnis extrahieren./output
und dies als Ergebnis erhalten:dann gibt die
-j
Option Folgendes aus (alle Pfade gestreift):quelle