Apakah ada cara untuk mengedit file di dalam file zip tanpa mengekstraksinya secara eksplisit terlebih dahulu?

47

Terkadang saya perlu membuat perubahan pada file .zip atau .jar, jadi saya biasanya memindahkan file /tmp, mengekstrak semua file dengan unzip, mengedit beberapa file, dan kemudian zip kembali file. Ini bekerja, tetapi bisa membosankan. Apakah ada skrip utilitas atau shell yang dapat saya gunakan untuk mengedit file di dalam file zip tanpa secara eksplisit memanggil unzipdan zip(bahkan jika itu hanya pembungkus perintah ini)?

austin
sumber
Hanya ingin tahu apakah jawabannya berfungsi pada file .jar? (Saya tidak mengujinya di sana.)
Beroe
@beroe Seharusnya karena mereka menggunakan algoritma kompresi zip. Itu sebenarnya motivasi utama saya untuk mencari solusi karena saya memiliki .war file dikerahkan pada server aplikasi yang saya tidak merasa seperti mengemas ulang dan menyebarkan kembali hanya untuk memodifikasi satu file.
austin
Besar. Saya akan mencoba untuk memperbaiki fungsi sehingga mempertahankan struktur direktori di dalam arsip. Saat ini saya pikir ini hanya berfungsi pada file di tingkat root, tetapi untuk tujuan saya, subfolder lebih bermanfaat.
Beroe
@beroe Itu keren sekali. Sebelum menanyakan ini, saya akan membuat kode skrip python untuk meluncurkan psudo-shell "di dalam" file zip untuk menjalankan perintah sewenang-wenang. Saya akan tertarik dengan apa yang Anda hasilkan.
austin
OK, menambahkan solusi lain untuk mendukung sub-folder, dan berfungsi dalam pengujian terbatas .
Beroe

Jawaban:

19

Apakah Anda tahu nama file di arsip sebelum membuka ritsletingnya? Anda dapat membuat fungsi untuk unzip /tmp, mengedit, dan menyegarkan zip:

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

Seperti yang dikatakan, penggunaannya adalah:

zipedit myarchive.zip myfile.txt

Ini membongkar file bernama dari arsip, menyimpannya /tmp, mengeditnya vilalu menambahkannya kembali ke arsip, sambil "membuang sampah" jalan. Tambahkan ke .bash_profile Anda, dengan asumsi bash...

EDIT: Di bawah ini adalah versi yang berfungsi dengan subfolder di dalam arsip ... Catatan, jangan gunakan garis miring sebelum nama folder (yaitu, gunakan myfolder/file.txttidak /myfolder/file.txt). Jika Anda mengedit file yang belum ada dalam arsip, itu akan membuatnya untuk Anda. Juga tidak yakin apakah itu akan berfungsi dengan jalur absolut ke file zip. Stick terbaik dengan relatif.

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

Terima kasih untuk pertanyaannya. Saya mungkin akan berakhir menggunakan yang ini juga!

Suntingan lain: Belum diuji, tetapi saya membacanya vimdan emacsapakah keduanya akan mengedit file jar secara langsung?

beroe
sumber
Saya dapat mengkonfirmasi bahwa vim bekerja dengan baik untuk mengedit file zip dari baris perintah di Linux, terima kasih banyak atas tipnya!
Thomas Bindzus
60

Vim mendukung pengeditan file secara transparan di dalam file zip. Eksekusi saja:

vim file.zip

dan Anda akan ditampilkan daftar file di dalam arsip zip. Pilih yang ingin Anda edit, ubah yang Anda inginkan, dan keluar dengan: x

Jika vimmerespons dengan:

Tidak dapat melakukan perubahan, 'dapat dimodifikasi' tidak aktif

.. jalankan saja :set modifiableatau :set ma(sumber: https://stackoverflow.com/questions/5745506/vim-modifiable-is-off )

Jesjimher
sumber
2
Omong-omong, dukungan zip default di vim hanya memungkinkan pengeditan ZIP satu tingkat. Jika Anda perlu mengedit ZIP di dalam ZIP, Anda harus menggunakan plugin vim ini .
jesjimher
1
Sama dengan emacs.
Mike
4
Ini harus ditandai sebagai jawaban yang tepat
Martijn Burger
3
penolong. Fitur yang sangat keren dari vim, dan juga cukup tidak terduga
Peter Perháči
4

Jawaban singkat: TIDAK.

Jika itu wrapper, Anda sedang menelepon perintah ini. Bagaimanapun, yang terbaik yang bisa saya pikirkan adalah membuka file menggunakan file-roller, jika Anda berada di lingkungan X, yang mungkin bekerja dengan klik dua kali sederhana, tergantung pada pengaturan Anda. Anda kemudian dapat mengklik dua kali pada file yang dikompresi untuk membukanya dan kemudian Anda dapat mengeditnya:

$ file-roller b3.zip 

Saat Anda menyimpan file yang diedit, Anda harus mendapatkan dialog ini:

Anda dapat membuat skrip untuk ini juga, tetapi itu menjadi rumit jika Anda memiliki arsip terkompresi yang berisi banyak file. Beri tahu saya jika itu yang Anda butuhkan dan saya mungkin bisa memasak sesuatu.

masukkan deskripsi gambar di sini

terdon
sumber
0

Jawaban pedantic pendek; tidak. Jika Anda berpikir tentang kompresi, Anda menggunakan redundansi untuk mempersingkat file di dalamnya, jadi setiap pengeditan mengubah seluruh file dalam arsip, mungkin arsip.

Jika Anda kurang teoretis, lebih praktis, lebih banyak "Saya tidak ingin harus secara manual unzip / zip" ada alat yang dapat Anda gunakan. bahtera di Linux adalah salah satu yang saya gunakan. Anda juga bisa memasang arsip dengan fuse-zip , meskipun itu mungkin lebih berfungsi daripada file temp.

Homolka yang kaya
sumber
tidak tahu mengapa seseorang memberi -1. +1 untuk fuse-zip.
myrdd
0

Menurut halaman manual untuk zip(versi online untuk referensi mudah: http://linux.die.net/man/1/zip ), zipperintah memiliki -ubendera yang digambarkan sebagai:

Ganti (perbarui) entri yang ada di arsip zip hanya jika telah dimodifikasi lebih baru daripada versi yang sudah ada dalam arsip zip.

Pengawas mahasiswa
sumber
0

Manajer file Direktori Opus 12 akan memungkinkan Anda untuk menelusuri Zip, lalu seret dan letakkan file yang diedit dari folder lain ke dalamnya dan timpa file yang ingin Anda edit, dan itu akan melakukan semuanya dengan cepat. Sangat mudah

Technometri
sumber
0

Saya menulis plugin Vim yang memperluas stock zip.vim untuk menelusuri dan mengedit file zip bersarang.

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

lbrayner
sumber
bagaimana Anda menginstal ini di linux?
Pandrei
Saya menambahkan instruksi instalasi ke README dari repositori . Silakan periksa kembali.
lbrayner
0

Anda dapat menggunakan editor teks KDE standar misalnya:

  1. buka arsip di pengelola arsip
  2. buka file teks dalam editor gui KDE
  3. simpan file teks dan sistem meminta Anda untuk menyegarkan arsip - klik ya
  4. jangan lupa tentang izin untuk arsip dan folder arsip (kesalahan favorit saya)
tvorez
sumber
Harap perbaiki pemformatan pada posting Anda.
davidbaumann