Czy istnieje sposób edycji plików w pliku zip bez uprzedniego wyraźnego wyodrębnienia ich?


47

Czasami muszę wprowadzić zmiany w pliku .zip lub .jar, więc zwykle przenoszę go /tmp, rozpakuj wszystkie pliki unzip, edytuj kilka plików, a następnie ponownie skompresuj. To działa, ale może być nudne. Czy istnieje narzędzie lub skrypt powłoki, którego można użyć do edycji pliku wewnątrz pliku zip bez jawnego wywoływania unzipi zip(nawet jeśli jest to tylko opakowanie tych poleceń)?


Ciekawe, czy odpowiedź działa na plikach .jar? (Nie testowałem tego tam.)
beroe

@beroe Powinien, ponieważ używają algorytmu kompresji zip. To była właśnie moja główna motywacja do poszukiwania rozwiązania, ponieważ miałem pliki .war wdrożone na serwerze aplikacji, których nie miałem ochoty na ponowne pakowanie i ponowne wdrażanie tylko w celu zmodyfikowania pojedynczego pliku.
austin

Wspaniały. Spróbuję naprawić tę funkcję, aby zachowała strukturę katalogów w archiwum. Obecnie myślę, że działa tylko na plikach na poziomie głównym, ale dla moich celów podfoldery są bardziej przydatne.
beroe

@beroe To całkiem fajne. Zanim o to zapytałem, zamierzałem napisać skrypt w języku Python do uruchamiania powłoki psudo „wewnątrz” pliku zip w celu wykonania dowolnych poleceń. Byłbym zainteresowany tym, co wymyślisz.
austin

OK, dodano inne rozwiązanie do obsługi podfolderów i działa w ograniczonych testach.
beroe

Odpowiedzi:


19

Czy znasz nazwę pliku w archiwum przed rozpakowaniem? Możesz utworzyć funkcję do rozpakowywania /tmp, edytowania i odświeżania zip:

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

Jak mówi, użycie jest następujące:

zipedit myarchive.zip myfile.txt

To rozpakowuje nazwany plik z archiwum, zapisuje go /tmp, edytuje, via następnie dodaje z powrotem do archiwum, „zbierając” ścieżkę. Dodaj do swojego .bash_profile, zakładając bash...

EDYCJA: Poniżej znajduje się wersja, która działa z podfolderami w archiwum ... Uwaga: nie używaj ukośnika przed nazwą folderu (tzn. myfolder/file.txtNie używaj /myfolder/file.txt). Jeśli edytujesz plik, który jeszcze nie istniał w archiwum, utworzy go dla Ciebie. Nie jestem również pewien, czy będzie działać z bezwzględną ścieżką do pliku zip. Najlepszy kij z krewnym.

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"
}

Dzięki za pytanie. Prawdopodobnie też skończę z tym!

Kolejna edycja: nieprzetestowane, ale przeczytałem to vimi emacsbędę bezpośrednio edytować pliki jar?


Mogę potwierdzić, że vim działa doskonale do edycji plików zip z wiersza poleceń w systemie Linux, bardzo dziękuję za wskazówkę!
Thomas Bindzus

60

Vim obsługuje przezroczystą edycję plików w plikach zip. Po prostu wykonaj:

vim file.zip

i zostanie wyświetlona lista plików w archiwum zip. Wybierz ten, który chcesz edytować, zmień co chcesz i wyjdź za pomocą: x

Jeśli vimodpowiada:

Nie można wprowadzać zmian, opcja „modyfikowalna” jest wyłączona

.. po prostu uruchom :set modifiablelub :set ma(źródło: https://stackoverflow.com/questions/5745506/vim-modifiable-is-off )


2
Nawiasem mówiąc, domyślna obsługa zip w vimie pozwala tylko na edycję ZIP jednego poziomu. Jeśli chcesz edytować pliki ZIP w plikach ZIP, powinieneś użyć tej wtyczki vim .
jesjimher

1
To samo z emacsem.
Mike

4
Należy to zaznaczyć jako właściwą odpowiedź
Martijn Burger

3
ratownik życia. naprawdę fajna funkcja vima i dość nieoczekiwana
Peter Perháč,

4

Krótka odpowiedź: NIE.

Jeśli jest to wrapper, to nazywając tych poleceń. W każdym razie najlepsze, co mogę wymyślić, to otworzyć plik za pomocą file-roller, jeśli jesteś w środowisku X, który może działać za pomocą podwójnego kliknięcia, w zależności od konfiguracji. Następnie możesz dwukrotnie kliknąć skompresowany plik, aby go otworzyć, a następnie możesz go edytować:

$ file-roller b3.zip 

Po zapisaniu edytowanego pliku powinieneś wyświetlić następujące okno dialogowe:

Możesz również utworzyć skrypt do tego, ale komplikuje się, jeśli masz skompresowane archiwa zawierające wiele plików. Daj mi znać, jeśli tego potrzebujesz, a może uda mi się coś ugotować.

wprowadź opis zdjęcia tutaj


0

Krótka pedantyczna odpowiedź; Nie. Jeśli myślisz o kompresji, używasz redundancji, aby skrócić pliki w środku, więc każda edycja zmienia cały plik w archiwum, prawdopodobnie archiwum.

Jeśli jesteś mniej teoretyczny, bardziej praktyczny, bardziej „Nie chcę ręcznie rozpakowywać / zipować”, możesz skorzystać z narzędzi. Arka w Linuksie jest tym, z którego korzystałem. Możesz także zamontować archiwum za pomocą fuse-zip , ale to prawdopodobnie więcej pracy niż plik tymczasowy.


nie wiem, dlaczego ktoś dał -1. +1 dla fuse-zip.
myrdd

0

Według strony man dla zip(wersja online dla łatwego odniesienia: http://linux.die.net/man/1/zip ), zippolecenie ma -uflagę, którą opisuje jako:

Zastąp (aktualizuj) istniejący wpis w archiwum zip tylko wtedy, gdy został on zmodyfikowany później niż wersja już w archiwum zip.


0

Menedżer plików Directory Opus 12 pozwoli ci przeglądać Zip, a następnie przeciągnij i upuść edytowany plik z innego folderu do niego i nadpisz plik, który chcesz edytować, i zrobi to wszystko w locie. Bardzo łatwe



0

Możesz użyć standardowego edytora tekstu KDE, na przykład:

  1. otwórz archiwum w menedżerze archiwów
  2. otwórz plik tekstowy w edytorze GUI KDE
  3. zapisz plik tekstowy i system poprosi o odświeżenie archiwum - kliknij tak
  4. nie zapomnij o pozwoleniu na archiwum i folder archiwum (mój ulubiony błąd)

Popraw formatowanie postu.
davidbaumann
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.