Vermeiden Sie unerwünschte Pfade in Zip-Dateien

49

Ich mache ein Shell-Skript, um einige Dateien zu packen. Ich zippe ein Verzeichnis wie dieses:

zip -r /Users/me/development/something/out.zip /Users/me/development/something/folder/

Das Problem ist, dass das resultierende Archiv out.zip den gesamten Dateipfad enthält. Das heißt, wenn es entpackt wird, enthält es den gesamten Pfad "/ Users / me / development / anotherthing /". Können diese tiefen Pfade vermieden werden, wenn ein Verzeichnis in ein Archiv gestellt wird?

Wenn ich zip aus dem Zielverzeichnis heraus starte, habe ich dieses Problem nicht.

zip -r out.zip ./folder/

In diesem Fall bekomme ich nicht den ganzen Müll. Das betreffende Skript wird jedoch von überall aufgerufen.

FWIW, ich verwende Bash unter Mac OS X 10.6.

Jerwood
quelle

Antworten:

85

Ihr Skript sollte cdoder pushdund verwenden popd, um in das Verzeichnis zu gelangen, das das Stammverzeichnis des Archivs darstellt, bevor der zipBefehl ausgegeben wird. Wie Sie dies genau tun, hängt davon ab, wie das Skript weiß, was es komprimieren soll. Wenn Sie jedoch möchten, dass der Ordner / Users / me / development / something / mit internen Pfaden von nur ./folder komprimiert wird , müssen Sie Folgendes tun:

pushd /Users/me/development/something
zip -r /path/to/out.zip ./folder/
popd

Dies führt dazu, dass Ihre Datei out.zip die gewünschten relativen Pfade enthält.

Wenn Sie Unterstützung beim Erstellen von Skripten benötigen, müssen Sie uns Ihr Skript zeigen.

Quacksalber
quelle
8
kein Problem. Ich mache dies die ganze Zeit in Einzeilern auf der Kommandozeile, zB: $ pushd /some/path ; do-something ; popd... oder sogar mit Subshells:$ ( cd /some/path ; do-something )
Quack Quixote
1
@ ~ quack: +1 speziell für die Sub-Shell-Technik im Kommentar.
Jonathan Leffler
1
Die Verwendung von &&anstelle von ;ist eine gute Idee, damit der andere Befehl nicht ausgeführt wird, wenn das cdfehlschlägt (Tippfehler oder anderes Problem):(cd /some/path && do-something)
Chris Johnsen
3
Gibt es keine Möglichkeit, dies zu tun, ohne den absoluten Pfad für die ZIP-Datei anzugeben?
Orange80
2
Warum spielst du mit dem Weg? Warum nicht benutzen zip -j?
Jww
5

Das Problem ist, dass das resultierende Archiv out.zip den gesamten Dateipfad enthält.
...
Ist es möglich, diese tiefen Pfade beim Ablegen eines Verzeichnisses in ein Archiv zu vermeiden?

Ja. Verwenden Sie die -jOption mit zip. -jist "Junk the Path". Laut der Manpage auf zip :

Speichern Sie nur den Namen einer gespeicherten Datei (geben Sie den Pfad an), und speichern Sie keine Verzeichnisnamen. Standardmäßig speichert zip den vollständigen Pfad (relativ zum aktuellen Verzeichnis).

Verwenden -jbedeutet den folgenden Befehl:

zip -j myarchive.zip file1.txt dir1/file2.txt dir2/dir3/file3.txt ../file4.txt

Erstellt ein Archiv, das wie folgt aussieht:

myarchive.zip
    |
    +-- file1.txt
    +-- file2.txt
    +-- file3.txt
    +-- file4.txt
jww
quelle
5
Trödelt das nicht auch alle Pfade, auch die im Verzeichnis 'folder'? Ich denke, das OP will nur den Pfad auf der Kommandozeile loswerden.
Peter Jaric
1
Dies ist möglicherweise nicht die Antwort auf diese Frage, aber es ist das, was ich brauche.
Aaron McMillin
1
Bei dieser Antwort wird fälschlicherweise davon ausgegangen, dass der Benutzer einen flachen Reißverschluss wünscht. Dies ist eine schlechte Annahme und kann dazu führen, dass das Skript fehlschlägt, wenn zwei Dateien in verschiedenen Unterordnern denselben Namen haben.
Andrew Schwartz
1

Es gibt pushdund popdund $OLDPWD. Angenommen, das $PWDist zu /Users/me/developmenttun:

pushd something/folder
zip -r $OLDPWD/something/out.zip *
popd

Nun $PWDist der wieder da/Users/me/development

borodark
quelle