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.