Tambahkan / perbarui file ke arsip tar.gz yang ada?

73

Apakah ada cara untuk menambah / memperbarui file di arsip tar.gz? Pada dasarnya, saya memiliki arsip yang berisi file di /data/data/com.myapp.backup/./files/settings.txtdan saya ingin menarik file itu dari arsip (sudah selesai) dan mendorongnya kembali ke arsip setelah pengeditan selesai. Bagaimana saya bisa mencapai ini? Apakah ini bermasalah karena ada .di jalur?

Naftuli Kay
sumber
2
+1. Ini akan membuat bekerja pada OS X begitu mudah. Saat ini, saya harus membersihkan direktori dari semua file yang disembunyikan .DS_Storedan kemudian men-tar ulang direktori tersebut.

Jawaban:

15

Format file tar hanyalah serangkaian file yang disatukan dengan beberapa header. Ini bukan pekerjaan yang sangat rumit untuk memisahkannya, memasukkan konten Anda, dan memasangnya kembali. Yang sedang berkata, Jander menggambarkan bagaimana tar sebagai program tidak memiliki fungsi utilitas untuk melakukan ini dan ada komplikasi tambahan dengan kompresi, yang harus sebelum dan sesudah melakukan perubahan.

Namun, ada alat untuk pekerjaan itu! Setidaknya ada dua sistem di luar sana yang akan memungkinkan Anda untuk melakukan mountbackback dari arsip tar terkompresi ke folder, kemudian membuat perubahan Anda dalam sistem file. Setelah selesai, lepaskan tautan folder dan arsip terkompresi Anda siap bergulir.

Opsi pertama adalah proyek archivemount untuk FUSE . Ini tutorialnya . Sistem Anda mungkin sudah memiliki FUSE dan jika tidak, distribusi Anda harus memiliki opsi untuk itu.

Pilihan lainnya adalah tarf . Ini lebih mudah digunakan , tetapi saya pernah mendengar ada masalah dengan merusak arsip bzip2 sehingga Anda dapat mengujinya terlebih dahulu.

Caleb
sumber
1
Saya menggunakan AVFS , yang dikemas dalam Ubuntu dan Debian. Apakah Anda tahu perbandingan antara arsip dan tarf dengan AVFS?
Gilles 'SO- stop being evil'
Jujur tidak, saya tidak, meskipun saya ingin melihat AVFS sekarang bahwa Anda menyebutkan alternatifnya. Saya telah menggunakan kedua archivemount dan tarf tetapi itu sudah lama sejak proyek dinonaktifkan dan tidak tahu keadaan mereka saat ini. Saya agak memutuskan dari pengalaman itu bahwa idenya salah secara konsep bahkan jika implementasinya bekerja dengan sempurna.
Caleb
Saya melihat bagaimana archivemount bekerja. Itu tidak mengubah file .tar.gz yang ada, tetapi ketika Anda meng-unmount, itu mengubah nama aslinya dan membuat file tar baru di tempatnya. Jika Anda mencari pengalaman pengguna yang baik, itu bagus, tetapi jika Anda ingin menghindari penulisan ulang seluruh arsip untuk alasan efisiensi, itu tidak akan membantu Anda.
Jander
@ Jander Itu untuk menunjukkan itu. Saya cukup yakin itu berlaku untuk semua opsi pemasangan arsip terkompresi. Masalahnya adalah bagian-bagian individual dari file tidak dikompresi, keseluruhan header file internal dan semua dikompresi dan agar hal lain untuk diekstraksi adalah seperti yang diharapkan gzip harus dijalankan pada seluruh set data. Tidak ada cara untuk menyuntikkan sesuatu di tengah ini tanpa mengekstraksi dan menjalankan kembali kompresi dan menulis ulang seluruh file data. Oleh karena itu komentar saya sebelumnya tentang hal itu menjadi solusi yang salah secara konseptual . Arsip adalah arsip.
Caleb
43

Untuk menarik file Anda dari arsip Anda, Anda dapat menggunakan tar xzf archive.tar.gz my/path/to/file.txt. Perhatikan bahwa direktori di jalur file akan dibuat juga. Gunakan tar t(mis. tar tzf archive.tar.gz) Untuk mendaftar file dalam arsip.

tartidak mendukung pembaruan file "di tempat". Namun, Anda dapat menambahkan file ke akhir arsip, bahkan jika mereka memiliki jalur yang sama dengan file yang sudah ada dalam arsip. Dalam hal ini, kedua salinan file tersebut akan berada di arsip, dan file yang ditambahkan nanti akan menimpa yang sebelumnya. Perintah yang digunakan untuk ini adalah tar r(atau tar uhanya menambahkan file yang lebih baru dari arsip) adalah perintah untuk digunakan. Di .jalan seharusnya tidak menjadi masalah.

Ada tangkapan, Anda tidak dapat menambahkan ke arsip terkompresi. Jadi, Anda harus melakukan:

gunzip archive.tar.gz
tar rf archive.tar data/data/com.myapp.backup/./files/settings.txt
gzip archive.tar

Yang mungkin bukan yang ingin Anda dengar, karena itu berarti menulis ulang seluruh arsip dua kali. Jika ini bukan arsip yang sangat besar, mungkin lebih baik untar semuanya dan kemudian tar ulang setelah diedit. Sebagai alternatif, Anda dapat menggunakan arsip yang tidak dikompresi.

Jander
sumber
Jawaban ini hanya benar sejauh ini berkaitan dengan tarprogram standar . Tar sebagai format file sebenarnya sangat mudah diakses. Anda dapat dengan mudah menulis skrip untuk memperbarui konten sendiri, tetapi ada alat lain yang sudah melakukan ini .
Caleb
23
Anda juga bisa melakukan ini dengan cara Unix:gzip -dc archive.tar.gz | tar -r data/data/com.myapp.backup/./files/settings.txt | gzip >archive_new.tar.gz
Simon Richter
2
IIRC Anda dapat menggabungkan dua file gzip'ed. Hasilnya adalah file gzip'ed yang lebih besar yang berisi kedua file yang tidak dikompresi disatukan.
FUZxxl
Setelah file di-unzip, apakah tidak mungkin menggunakan flag --update?
pietro
@FUZxxl +1 untuk menyebutkan concatenation gzip
Johan Boulé
9

Tar awalnya dimaksudkan untuk digunakan untuk kaset, jadi "mengganti" file tidak benar-benar dalam desain. Namun, Anda dapat menggunakan --delete untuk menghapus file dari tar asli dan kemudian -u untuk memperbarui tar dan menambahkan kembali file. Mungkin perlu sedikit, karena tar perlu mengatur ulang arsip secara internal.

leibman
sumber
Selamat datang di StackExchange! Jawaban Anda hanya berisi saran yang sudah dibuat di jawaban lain . Harap baca jawaban lain untuk pertanyaan sebelum menjawab, untuk menghindari membuat duplikat.
JigglyNaga
1
Saya sedikit mengedit jawaban saya. Saya tidak berpikir jawaban yang lain menyebutkan --delete
rleibman
-5

di Linux saya x86_64 GNU / Linux untuk melakukan operasi itu saya hanya menggunakan perintah berikut:

tar cvfpz /path/archive.tar -T list.txt

Perintah ini menyebabkan pembuatan arsip terkompresi di bawah /pathmenggunakan daftar file yang dimasukkan ke dalam list.txtfile.

user64312
sumber
6
Itu menimpa file yang sudah ada /path/archive.tar, alih-alih menambahkan / memperbarui file itu.
Anthon