Wie erstelle ich die Verzeichnisse in einer Zip-Datei relativ zum Zielverzeichnis anstelle meines Arbeitsverzeichnisses?

25

Ich rufe den zip-Befehl von einem Skript aus auf, in dem ich das Verzeichnis nicht ändern kann. Ich muss data/kit123/aus dem Verzeichnis, in dem sich die Daten befinden , eine Zip-Datei des Materials erstellen , aber ich möchte, dass der Inhalt der Zip-Datei nur der Inhalt von ist kit123, mit Pfaden relativ zu kit123.

Dies ist die Verzeichnisstruktur

myworkingdir
    data
        kit123
            kitpart1
                file.xcf
                anotherfile.xcf
            kitpart2
                ...
        kit124
            ...

Mein Skript wird in myworkingdir ausgeführt und kann keine Verzeichnisse ändern.

Wenn ich anrufe

zip -r kit123.zip data/kit123

dann wird die Struktur in der zip-Datei sein

data
    kit123
        kitpart1
            file.xcf
            anotherfile.xcf
        kitpart2

aber ich möchte, dass es so ist

kit123
    kitpart1
        file.xcf
        anotherfile.xcf
    kitpart2

Gibt es eine Zip-Option, die ich verwenden kann, um dies zu erreichen? Es scheint seltsam, dass es von meinem Arbeitsverzeichnis abhängen sollte

Ich weiß, dass es nicht -j ist. dass man die Struktur in kit123 zerstört

Nathan
quelle
Bah, egal, ich habe herausgefunden, wie ich das Verzeichnis ändern kann (in Python). Ich hatte nur schlecht organisierte Berechtigungen. Ich würde trotzdem gerne wissen, ob zip eine solche Option hat.
Nathan
Python zipfile.write(arcname=erlaubt es übrigens: docs.python.org/3.6/library/zipfile.html#zipfile.ZipFile.write
Ciro Santilli 新疆 新疆 改造 中心 六四 事件

Antworten:

18

Wie Sie in den Kommentaren notieren, wissen Sie jetzt, wie Sie das Verzeichnis mit Ihrem Skript ändern, und ich erkläre die Situation mit zip in Bezug auf relative Pfade.

Es ist wahrscheinlich am einfachsten, das Terminal zu öffnen und cdzu kit123; Sie müssen das Zielverzeichnis zu Ihrem Arbeitsverzeichnis machen. Sie können den Befehl nicht von der Basis Ihres Basisverzeichnisses ausführen, da er sonst alle Pfade von aufnimmt. /home/$USER/..Wenn Sie die -jOption verwenden, werden alle Pfade entfernt, wie es keine gibt 't wirklich ein Äquivalent der tar-Option, --stripmit der verschiedene Ebenen der Pfadentfernung angegeben werden können.

Also cd bitte in dein Zielverzeichnis ( kit123) und gib ein:

zip -r kit123.zip *

Dadurch werden rekursiv ( -r) alle ( *) Dateien und Dateiverzeichnisse im aktuellen Verzeichnis ( kit123) -pbeibehalten , und da relative Pfade ( ) automatisch beibehalten werden, sofern die -jOption nicht vorhanden ist, wird die Verzeichnisstruktur wie gewünscht beibehalten . Kit123und Unterordner ( kitpart1) mit ihren eigenen Dateien werden vorhanden sein:

kit123
    kitpart1
        file.xcf
        anotherfile.xcf
    kitpart2

Sie können den Inhalt der ZIP-Datei mit überprüfen unzip -l zipfile.zip.

Weitere Informationen zu den anderen verfügbaren Optionen zipfinden Sie unter man zipund in der Ubuntu-Manpage online .


quelle