GNU/Linux >> Belajar Linux >  >> Linux

Gabungkan banyak file tar dalam satu perintah

Pertanyaan ini agak lama tetapi saya berharap lebih mudah bagi saya untuk menemukan informasi berikut lebih cepat. Jadi, jika ada orang lain yang menemukan ini, selamat menikmati:

Apa yang dijelaskan Jeff di atas adalah bug yang dikenal di gnu tar (dilaporkan pada Agustus 2008). Hanya arsip pertama (arsip setelah -f opsi) menghapus penanda EOF-nya. Jika Anda mencoba menggabungkan lebih dari 2 arsip, arsip terakhir akan "tersembunyi" di belakang penanda akhir file.

Ini adalah bug di tar. Itu menggabungkan seluruh arsip, termasuk blok nol yang tertinggal, jadi secara default membaca arsip yang dihasilkan berhenti setelah penggabungan pertama.

Sumber:https://lists.gnu.org/archive/html/bug-tar/2008-08/msg00002.html (dan pesan berikut)

Mempertimbangkan usia bug, saya bertanya-tanya apakah itu akan diperbaiki. Saya ragu ada massa kritis yang terpengaruh.

Cara terbaik untuk menghindari bug ini adalah dengan menggunakan -i opsi, setidaknya untuk file .tar di sistem file Anda.

Seperti yang ditunjukkan Jeff tar --concatenate dapat memakan waktu lama untuk mencapai EOF sebelum menggabungkan arsip berikutnya. Jadi jika Anda akan terjebak dengan arsip "rusak" yang membutuhkan tar -i opsi untuk untar, saya sarankan yang berikut:

Alih-alih menggunakan tar --concatenate -f archive1.tar archive2.tar archive3.tar kemungkinan Anda akan lebih baik untuk berlari cat archive2.tar archive3.tar >> archive1.tar atau pipa ke dd jika Anda bermaksud menulis ke perangkat kaset. Perhatikan juga bahwa ini bisa menyebabkan perilaku yang tidak terduga jika kaset tidak menjadi nol sebelum (berlebihan) menulis data baru ke dalamnya. Oleh karena itu pendekatan yang akan saya ambil dalam aplikasi saya adalah tar bersarang seperti yang disarankan dalam komentar di bawah pertanyaan.

Saran di atas didasarkan pada contoh tolok ukur yang sangat kecil berikut:

time tar --concatenate -vf buffer.100025.tar buffer.100026.tar
  real  65m33.524s
  user  0m7.324s
  sys   2m50.399s

time cat buffer.100027.tar >> buffer.100028.tar
  real  46m34.101s
  user  0m0.853s
  sys   1m46.133s

File buffer.*.tar semuanya berukuran 100GB, sistem hampir tidak aktif kecuali untuk setiap panggilan. Perbedaan waktu cukup signifikan sehingga saya pribadi menganggap tolok ukur ini valid meskipun ukuran sampelnya kecil, tetapi Anda bebas menilai sendiri tentang hal ini dan mungkin lebih baik menjalankan tolok ukur seperti ini pada perangkat keras Anda sendiri.


Ini mungkin tidak membantu Anda, tetapi jika Anda ingin menggunakan -i opsi saat mengekstraksi dari arsip final, maka Anda cukup cat tar bersama-sama. File tar diakhiri dengan header yang penuh dengan null dan lebih banyak padding null hingga akhir catatan. Dengan --concatenate tar harus melalui semua header untuk menemukan posisi yang tepat dari header terakhir, untuk mulai menimpanya di sana.

Jika Anda hanya cat tar, Anda hanya memiliki nol ekstra di antara header. -i opsi meminta tar untuk mengabaikan null ini di antara header. Jadi Anda bisa

cat  receiverTar1.tar receivedTar2.tar ... >>alltars.tar
tar -itvf alltars.tar

Juga, tar --concatenate Anda contoh harus bekerja. Namun, jika Anda memiliki file dengan nama yang sama di beberapa arsip tar, Anda akan menulis ulang file tersebut beberapa kali saat Anda mengekstrak semuanya dari tar yang dihasilkan.


Linux
  1. Menggabungkan File Tertentu Menjadi Satu File Tunggal?

  2. Cara Mengganti Nama Banyak File Sekaligus di Linux

  3. perintah bsdtar – Membaca dan menulis file arsip tape

  1. Bagaimana saya bisa menyalin banyak file melalui scp dalam satu perintah?

  2. Bagaimana cara membuat arsip tar dipecah menjadi, atau mencakup, banyak file?

  3. Ekstrak file tertentu dalam arsip tar menggunakan wildcard

  1. Cara Membagi Arsip 'tar' Besar menjadi Beberapa File dengan Ukuran Tertentu

  2. Bagaimana Mengompresi Banyak File Menjadi Arsip .xz?

  3. Perintah tar Linux