Gibt es eine Möglichkeit, Dateien in einer ZIP-Datei zu bearbeiten, ohne sie zuerst explizit zu extrahieren?

47

Manchmal muss ich Änderungen an einer .zip- oder .jar-Datei vornehmen, daher verschiebe ich die Datei normalerweise nach /tmp, extrahiere alle Dateien mit unzip, bearbeite einige Dateien und komprimiere die Dateien erneut. Das funktioniert, aber es kann mühsam sein. Gibt es ein Hilfsprogramm oder ein Shell-Skript, mit dem ich eine Datei in einer Zip-Datei bearbeiten kann, ohne explizit unzipund aufzurufen zip(auch wenn es sich nur um einen Wrapper um diese Befehle handelt)?

Austin
quelle
Nur neugierig, ob die Antwort auf JAR-Dateien funktioniert? (Ich habe es dort nicht getestet.)
beroe
@beroe Es sollte da der zip-Komprimierungsalgorithmus verwendet werden. Das war eigentlich meine Hauptmotivation für die Suche nach einer Lösung, da ich WAR-Dateien auf einem App-Server bereitgestellt hatte, für den ich keine Lust hatte, sie neu zu packen und erneut bereitzustellen, nur um eine einzelne Datei zu ändern.
Austin
Toll. Ich werde versuchen, die Funktion so zu reparieren, dass die Verzeichnisstruktur im Archiv erhalten bleibt. Momentan denke ich, dass es nur für Dateien auf Root-Ebene funktioniert, aber für meine Zwecke sind Unterordner nützlicher.
Beroe
@beroe Das ist ziemlich cool. Bevor ich das gefragt habe, wollte ich ein Python-Skript zum Starten einer Psudo-Shell "innerhalb" der zip-Datei programmieren, um beliebige Befehle auszuführen. Es würde mich interessieren, was Sie sich einfallen lassen.
Austin
OK, es wurde eine weitere Lösung zur Unterstützung von Unterordnern hinzugefügt, die nur in begrenztem Umfang getestet werden kann.
Beroe

Antworten:

19

Kennen Sie den Namen der Datei im Archiv, bevor Sie sie entpacken? Sie können eine Funktion zum Entpacken /tmp, Bearbeiten und Aktualisieren der Zip erstellen :

zipedit(){
    echo "Usage: zipedit archive.zip file.txt"
    unzip "$1" "$2" -d /tmp 
    vi /tmp/$2 && zip -j --update "$1"  "/tmp/$2" 
}

Wie es heißt, ist die Verwendung:

zipedit myarchive.zip myfile.txt

Dies entpackt die benannte Datei aus dem Archiv, speichert sie dort /tmp, bearbeitet sie dort viund fügt sie dann wieder dem Archiv hinzu, während der Pfad "blockiert" wird. Fügen Sie Ihrem .bash_profil hinzu, vorausgesetzt bash...

BEARBEITEN: Nachfolgend finden Sie eine Version, die mit Unterordnern im Archiv funktioniert. Beachten Sie, dass Sie keinen Schrägstrich vor dem Namen des Ordners verwenden (dh myfolder/file.txtnicht verwenden /myfolder/file.txt). Wenn Sie eine Datei bearbeiten, die noch nicht im Archiv vorhanden ist, wird sie für Sie erstellt. Ich bin mir auch nicht sicher, ob es mit dem absoluten Pfad zur Zip-Datei funktioniert. Am besten bei Verwandten bleiben.

zipedit(){
    echo "Usage: zipedit archive.zip folder/file.txt"
    curdir=$(pwd)
    unzip "$1" "$2" -d /tmp 
    cd /tmp
    vi "$2" && zip --update "$curdir/$1"  "$2" 
    # remove this line to just keep overwriting files in /tmp
    rm -f "$2" # or remove -f if you want to confirm
    cd "$curdir"
}

Danke für die Frage. Ich werde wahrscheinlich auch dieses verwenden!

Eine andere Bearbeitung: Ungetestet, aber ich habe das gelesen vimund emacswerden beide JAR-Dateien direkt bearbeiten?

beroe
quelle
Ich kann bestätigen, dass vim hervorragend zum Bearbeiten von zip-Dateien über die Befehlszeile unter Linux geeignet ist, vielen Dank für den Tipp!
Thomas Bindzus
59

Vim unterstützt das transparente Bearbeiten von Dateien in ZIP-Dateien. Führen Sie einfach Folgendes aus:

vim file.zip

und Ihnen wird eine Liste der Dateien im zip-Archiv angezeigt. Wählen Sie das zu bearbeitende aus, ändern Sie die gewünschten Einstellungen und beenden Sie das Programm mit: x

Wenn vimantwortet mit:

Änderungen können nicht vorgenommen werden, 'änderbar' ist deaktiviert

.. einfach ausführen :set modifiableoder :set ma(Quelle: https://stackoverflow.com/questions/5745506/vim-modifiable-is-off )

jesjimher
quelle
2
Übrigens erlaubt die standardmäßige Zip-Unterstützung in vim nur das Bearbeiten von einstufigen ZIPs. Wenn Sie ZIPs in ZIPs bearbeiten müssen, sollten Sie dieses vim-Plugin verwenden .
jesjimher
1
Gleiches gilt für Emacs.
Mike
4
Dies sollte als die richtige Antwort markiert werden
Martijn Burger
3
Lebensretter. wirklich coole Funktion von Vim, und ganz unerwartet auch
Peter Perháč
4

Kurze Antwort: NEIN.

Wenn es ein Wrapper ist, Sie werden fordern diese Befehle. Wie auch immer, das Beste, was ich mir vorstellen kann, ist, die Datei file-rollerin einer X-Umgebung mit einem einfachen Doppelklick zu öffnen. Dies hängt von Ihrem Setup ab. Sie können dann auf die komprimierte Datei doppelklicken, um sie zu öffnen, und sie dann bearbeiten:

$ file-roller b3.zip 

Wenn Sie Ihre bearbeitete Datei speichern, sollten Sie diesen Dialog erhalten:

Sie könnten auch ein Skript dafür erstellen, aber das wird kompliziert, wenn Sie Archive komprimiert haben, die mehrere Dateien enthalten. Lassen Sie mich wissen, ob Sie das brauchen, und ich kann Ihnen vielleicht etwas einfallen lassen.

Bildbeschreibung hier eingeben

terdon
quelle
0

Kurze umständliche Antwort; Nein. Wenn Sie an Komprimierung denken, verwenden Sie Redundanz, um die darin enthaltenen Dateien zu verkürzen, sodass bei jeder Bearbeitung die gesamte Datei im Archiv, möglicherweise auch das Archiv, geändert wird.

Wenn Sie weniger theoretisch, praktischer und "Ich möchte nicht manuell entpacken / zip" sind, gibt es Tools, die Sie verwenden können. Ich habe ark unter Linux verwendet. Sie können das Archiv auch mit fuse-zip mounten , obwohl das wahrscheinlich mehr Arbeit ist als eine temporäre Datei.

Reiche Homolka
quelle
Ich weiß nicht, warum jemand -1 gegeben hat. +1 für fuse-zip.
11.
0

Laut der Manpage für zip(Online-Version zum einfachen Nachschlagen: http://linux.die.net/man/1/zip ) hat der zipBefehl ein -uFlag, das wie folgt beschrieben wird:

Ersetzen (aktualisieren) Sie einen vorhandenen Eintrag im ZIP-Archiv nur, wenn er vor kurzem geändert wurde als die Version, die sich bereits im ZIP-Archiv befindet.

Proktor
quelle
0

Mit dem Directory Opus 12-Dateimanager können Sie die ZIP-Datei durchsuchen, dann die bearbeitete Datei aus einem anderen Ordner in diesen ziehen und die zu bearbeitende Datei überschreiben, und das alles im Handumdrehen. Sehr leicht

Technometrie
quelle
0

Ich habe ein Vim-Plugin geschrieben, das stock zip.vim erweitert, um verschachtelte Zip-Dateien zu durchsuchen und zu bearbeiten.

https://github.com/lbrayner/vim-rzip

Brayner
quelle
Wie installierst du das unter Linux?
Pandrei
Ich habe der README-Datei des Repositorys Installationsanweisungen hinzugefügt . Bitte überprüfe nochmals.
Brayner
0

Sie können einen Standard-KDE-Texteditor verwenden, zum Beispiel:

  1. Archiv im Archivmanager öffnen
  2. Textdatei im KDE-GUI-Editor öffnen
  3. Speichern Sie die Textdatei und das System fordert Sie auf, das Archiv zu aktualisieren. Klicken Sie auf Ja
  4. Vergessen Sie nicht die Erlaubnis für das Archiv und den Ordner des Archivs (mein Lieblingsfehler)
tvorez
quelle
Bitte korrigieren Sie die Formatierung Ihres Beitrags.
Davidbaumann