Menambahkan file ke file tbz

8

Saya mencari cara untuk memperbarui ribuan file arsip .tbz, jadi saya akan melakukan ini dengan skrip shell. Saya perlu menambahkan satu file ke masing-masing.

Pertanyaan saya adalah, adakah cara yang lebih cepat untuk melakukan ini tanpa mengekstraksi setiap konten tbz, lalu mengompres ulang dengan file baru yang termasuk dalam tar yang terkandung? Seperti apa bentuk perintahnya?

Terima kasih

BotolZero
sumber
Alternatif yang jelas adalah menempatkan file terkompresi ke dalam tarball yang tidak dikompresi. Tapi itu mengubah format data sehingga mungkin tidak layak untuk Anda, dan itu bisa tidak efisien untuk sejumlah besar file kecil dengan redundansi di antara mereka.
Pasang kembali Monica

Jawaban:

12

Meskipun tardapat menambahkan file ke arsip yang sudah ada, itu tidak dapat dikompresi. Anda harus bunzip2mengarsipkan arsip, meninggalkan tarball standar. Anda kemudian dapat menggunakan tarkemampuan untuk menambahkan file ke arsip yang ada, dan kemudian mengkompres ulang dengan bzip2.

Dari manual:

 -r      Like -c, but new entries are appended to the archive.  Note that this only
         works on uncompressed archives stored in regular files.  The -f option is
         required.
DopeGhoti
sumber
itu memang benar
Kiwy
Ini adalah satu metode, tetapi itu bukan satu-satunya metode. Dimungkinkan untuk memodifikasi aliran bzip2 tanpa sepenuhnya mengompresnya. Saya tidak tahu apakah mungkin untuk melakukannya dengan cara yang memungkinkan menambahkan bersih ke arsip tar, tetapi Dhag menunjukkan metode parsial.
Gilles 'SANGAT berhenti menjadi jahat'
10

Jawaban lainnya benar: Anda tidak dapat memperbarui arsip tar terkompresi dengan benar tanpa mengompresnya. Dokumentasi tar GNU mengisyaratkan hal itu, dan berusaha memperbarui gagal dengan pesan kesalahan eksplisit:

$ tar --concatenate --file=cat.tar.bz2 two.tar.bz2 
tar: Cannot update compressed archives
tar: Error is not recoverable: exiting now

Namun, jika Anda tertarik pada solusi semacam pekerjaan kotor yang tidak memerlukan dekompresi, saya dapat memberikannya, berdasarkan pengamatan berikut:

  • Menambahkan penggunaan stream bzip2 catdidukung dan menghasilkan stream bzip2 yang valid (hal yang sama berlaku untuk gzip);
  • menambahkan ter menggunakan cattidak menghasilkan file tar yang valid, itulah sebabnya --concatenatepilihan ada, tetapi kita dapat meminta tar untuk berpura-pura valid:

Mungkin tampak lebih intuitif bagi Anda untuk menginginkan atau mencoba menggunakan kucing untuk menyatukan dua arsip daripada menggunakan --concatenateoperasi; lagipula, cat adalah utilitas untuk menggabungkan file.

Namun, arsip tar menggabungkan penanda akhir file yang harus dihapus jika arsip gabungan harus dibaca dengan benar sebagai satu arsip. --concatenatemenghapus penanda akhir arsip dari arsip target sebelum setiap arsip baru ditambahkan. Jika Anda menggunakan cat untuk menggabungkan arsip, hasilnya tidak akan menjadi arsip format tar yang valid. Jika Anda perlu mengambil file dari arsip yang ditambahkan untuk menggunakan utilitas cat, gunakan opsi --ignore-zeros( -i).

Berdasarkan pengetahuan ini, bisa kita lakukan, misalnya:

cat {one,two}.tar.bz2 >combined.tar.bz2

Hasil ini, seperti yang dijelaskan oleh cuplikan dokumentasi di atas, dalam file tar yang tidak valid, tetapi menggunakan --ignore-zeros, masih dapat dibaca sepenuhnya:

## Show contents of `one.tar.bz2'
$ tar tf one.tar.bz2
a
b

## Show contents of `two.tar.bz2'
$ tar tf two.tar.bz2
c

## Show contents of `combined.tar.bz2', bypassing the bad format
$ tar tif combined.tar.bz2
a
b
c

Perhatikan bagaimana hal di atas mencantumkan ketiga file dari dua arsip asli, sedangkan mengabaikan -i(dengan benar) hanya mencantumkan file dari arsip asli pertama:

$ tar tf combined.tar.bz2 
a
b

Sekali lagi, itu tidak lebih dari trik kotor, tetapi bisa berguna jika Anda mengontrol sisi penulisan dan membaca dan dapat memastikan bahwa itu -iakan digunakan ketika mencoba membaca dari file yang dibuat dengan cara ini.

Dhag
sumber
Itu sangat menarik terima kasih atas tanggapan terperinci. Sayangnya saya tidak bisa mengendalikan proses yang pada akhirnya akan membaca arsip ini.
BottleZero
Ini dapat digunakan untuk "menyembunyikan" beberapa file dalam arsip sehingga seseorang yang mengekstraksi dengan santai hanya akan mendapatkan konten tarball asli, tetapi mereka yang tahu menambahkannya ike baris perintah akan melihat semuanya.
Monty Harder