Komprimieren Sie eine Datei ohne das übergeordnete Verzeichnis

12

Ich habe einen Ordner, der mehrere Dateien enthält

Mappe

  • artekt1.app
  • artefakt2.ext2
  • artefakt3.ext3
  • ...

Mein Ziel ist es, die Datei von außerhalb dieses Ordners zu komprimieren (also ohne cdBefehl zu verwenden), ohne das Ordnerverzeichnis einzuschließen.

zip -r ./folder/artifact.zip ./folder/artifact1.app

Dieser Befehl enthält das Ordnerverzeichnis in der endgültigen Zip-Datei. Irgendwelche Hinweise?

Verwandte Frage: Komprimieren Sie den Inhalt eines Ordners, ohne den Ordner selbst einzuschließen

Lorenzo B.
quelle
1
Aus den Manpages geht hervor, dass nur -jdies zutreffen würde, und dass alle Ordner in einem einzigen Verzeichnis auf Stammebene innerhalb der ZIP-Datei komprimiert würden. Das ist nicht das, wonach Sie suchen, oder?
Phyrfox
@phyrfox Vielleicht ja. Muss es überprüfen. Vielen Dank.
Lorenzo B

Antworten:

13

Wenn Sie alle Dateien folderunter ihrem Namen ohne Verzeichnisangabe speichern möchten , können Sie die -jOption verwenden.

zip -j folder/artifact.zip folder/artifact1.app folder/artifact2.ext2 folder/artifact3.ext3

oder

zip -j folder/{artifact.zip,artifact1.app,artifact2.ext2,artifact3.ext3}

Wenn Sie Dateien in Unterverzeichnissen haben, haben diese auch keine Verzeichniskomponente im Archiv, z. B. folder/subdir/foowerden sie im Archiv als gespeichert foo.

Aber es wäre wahrscheinlich einfacher, in das Verzeichnis zu wechseln. Es ist fast genau die gleiche Menge an Eingabe wie die Klammermethode aboe. Wenn Sie dies tun und Dateien in Unterverzeichnisse aufnehmen, haben sie ihren relativen Pfad aus dem Verzeichnis, in das Sie geändert haben, z. B. folder/subdir/foowerden sie als gespeichert subdir/foo.

(cd folder && zip artifact.zip artifact1.app artifact2.ext2 artifact3.ext3)

Bei interaktiver Verwendung verlieren Sie auf diese Weise die Shell-Vervollständigung, da die Shell nicht erkennt, dass Sie sich beim Ausführen des zipBefehls in einem anderen Verzeichnis befinden . Um dies zu beheben, geben Sie den cdBefehl separat aus. Um einfach zum vorherigen Verzeichnis zurückzukehren, können Sie pushdund verwenden popd.

pushd folder
zip artifact.zip artifact1.app artifact2.ext2 artifact3.ext3
popd

Wenn Sie die vollständige Kontrolle über die in einer Zip-Datei gespeicherten Pfade haben möchten, können Sie eine Gesamtstruktur symbolischer Links erstellen. Sofern nicht anders angegeben, werden zipkeine symbolischen Links gespeichert.

Gilles 'SO - hör auf böse zu sein'
quelle
Sie müssen nicht alle Dateien im Unterverzeichnis ( folder) explizit zip -j folder/*
auflisten, sondern
Wenn Sie sich auf die Shell-Erweiterung verlassen, werden Punktdateien (z. B. .profile) nicht in das Archiv aufgenommen. Ändern Sie stattdessen das aktuelle Arbeitsverzeichnis und geben Sie .als zu archivierende Datei cd folder && zip -r ../folder.zip .
Folgendes an