Mengapa saya harus membuat satu file?


101

Di perusahaan saya, kami mengunduh snapshot basis data pengembangan lokal sebagai db.dump.tar.gzfile. Kompresi masuk akal, tetapi tarball hanya berisi satu file ( db.dump).

Apakah ada gunanya pengarsipan file tunggal, atau .tar.gzhanya idiom yang umum? Kenapa tidak adil .gz?


5
Ini hanya masalah konvensi menurut pendapat saya. Ketika orang melihat file dengan ekstensi gz, pemikiran default mereka adalah, menggunakan tar -zxvf. Tetapi bagi mereka yang melihat nama file dan melihatnya tidak memiliki .tgzekstensi, itu baik-baik saja untuk gzip file dump db. Karena saya tidak mengetahui algoritme kompresi secara terperinci, saya tidak yakin apakah tar melakukan kompresi pada file jarang seperti db dump, tetapi untuk file teks biasa, gzip file langsung memiliki keunggulan ukuran yang sangat kecil dibandingkan taring terlebih dahulu dan gzip ing file
MelBurslan

3
Semua tarring yang akan dilakukan file tunggal adalah menambahkan beberapa blok metadata ke awal dan akhir file. Data file aktual melewati tar ke kompresor tanpa disentuh. Jadi untuk file besar perbedaan ukuran antara kompresi polos dan taring akan diabaikan.
plugwash

Di masa lalu ketika mencoba berbagai metode kompresi saya menemukan .tar.gzlebih unggul daripada kebanyakan metode umum lainnya. Saya ingat itu .tarlebih baik daripada adil tetapi tidak bisa mengingat apakah itu lebih baik daripada adil .gz. Ironisnya, .cabformat Window adalah yang terbaik dari metode yang saya coba, yang sangat tidak terduga.
Pharap

@Pharap tarbukan algoritma kompresi, ini adalah format pengarsipan
gardenhead

1
@ardenhead Nah itu akan menjelaskan mengapa itu tidak bekerja dengan baik.
Pharap

Jawaban:


163

Keuntungan menggunakan .tar.gzbukannya .gzitu

  • tarmenyimpan lebih banyak meta-data (izin UNIX dll.) daripada gzip.
  • pengaturan dapat lebih mudah diperluas untuk menyimpan banyak file
  • File .tar.gz sangat umum, hanya file yang di -gzip yang dapat membingungkan sebagian pengguna. (lih. komentar MelBurslans )

Biaya penggunaan tarjuga sangat kecil.

Jika tidak benar-benar diperlukan, saya masih tidak merekomendasikan untuk memasukkan satu file. Ada banyak alat bermanfaat yang dapat mengakses file tunggal terkompresi secara langsung (seperti zcat, zgrepdll. - juga ada untuk bzip2dan xz).


35
Saya tidak mempertimbangkan aspek meta-data. Poin yang sangat bagus
gardenhead

5
Jika saya melihat .gz, insting pertama saya adalah tar -zxf foo.gz. Mengingat bahwa gzip bahkan merupakan perintah, butuh beberapa detik lagi.
bgStack15

2
@ bgStack15 FWIW Anda tidak memerlukan z(atau dalam -hal ini), kebanyakan tars modern akan secara otomatis mendeteksi file perlu didekompresi.
drewbenn

2
Secara default gzipakan menyimpan nama file asli dan cap waktu. Anda dapat menggunakan -Nopsi ini saat melakukan dekompresi untuk memulihkannya.
Ross Ridge

@RossRidge terima kasih, saya menghapus lagi teks tentang nama file asli.
jofel

63

Anda sebenarnya hanya menanyakan setengah dari pertanyaan. Pertanyaan lainnya adalah, "Mengapa saya mengompres file tar dengan gzip?". Dan jawabannya bukan hanya itu yang gzipmembuat file lebih kecil (dalam kebanyakan kasus):

tar:

  • menyimpan nama file dan metadata lainnya : mode, ID pemilik, ID grup, filesize, waktu modifikasi
  • menyimpan checksum (hanya untuk header)

gzip:

  • dapat menyimpan nama file asli, tetapi itu opsional
  • memiliki CRC-32 checksum atas data asli
  • itu memampatkan file

Hanya dengan itu tarAnda tidak dapat memastikan data Anda tidak rusak. Dengan hanya gzipAnda tidak dapat mengembalikan ID pengguna / grup, waktu modifikasi dan mungkin bukan nama file asli.

Kombinasi ini lebih kuat daripada yang diberikan oleh masing-masing perintah / format, karena mereka melengkapi fitur masing-masing .


Terima kasih telah menjelaskannya! Ketika saya membaca tarhalaman wikipedia, saya salah mengerti deskripsi yang berarti bahwa checksum itu untuk seluruh file.
gardenhead

Bagi saya ini terasa seperti jawaban yang benar. Saya juga menambahkan beberapa alasan lagi, yang mungkin ingin Anda sunting jika Anda setuju. 1) tidak ada biaya tambahan untuk admin untuk .tgz atas .tar atau .gz saja: semuanya hanya satu perintah 2) Admin mencadangkan, menyalin, memindahkan, memindahkan BANYAK file, karena banyak alasan berbeda; Cadangan DB hanyalah salah satunya. Mereka dapat menggunakan alur kerja, alat, dan perintah yang sama apakah mencadangkan satu atau beberapa file; jadi mengapa specialcase menggunakan sintaks dari perintah gzip, untuk kasus di mana ada satu file?
Dewi Morgan

30

Ada keuntungan yang cukup besar untuk menggunakan file teks saja-gzip - isi dapat langsung diakses dengan alat baris perintah seperti less, zgrep, zcat.


poin yang menarik, tetapi pertanyaannya adalah tentang snapshot database, tidak mungkin berupa file teks, dan tidak hanya di-gzip.
underscore_d

9
@underscore_d semua dump database saya (kebanyakan mysql dan pgsql) adalah dump teks, sebagian karena mereka lebih dapat diselamatkan jika terjadi sesuatu yang sebagian merusak dump, dan sebagian karena saya dapat pra-proses pengembalian dengan alat yang biasa (sed , awk, perl, dll) jika perlu. yaitu lebih dapat diandalkan dan lebih bermanfaat daripada dump biner. Imbalannya adalah bahwa dump teks cenderung lebih besar (siapa yang peduli? Ruang disk murah dan kami memiliki kompresi yang baik) dan pemulihan lebih lambat secara signifikan (tetapi kurang begitu jika Anda membungkus pengembalian dalam transaksi).
cas

1
Apa keuntungan alat-alat ini dari sekadar menyalurkan output dekompresor ke alat sederhana?
CodesInChaos

21

Saya akan mengatakan bahwa kemungkinan orang tidak menyadari bahwa mereka dapat menggunakan gzip / bzip2 / xz tanpa tar. Mungkin karena mereka berasal dari latar belakang DOS / Windows di mana normal untuk kompresi dan pengarsipan untuk diintegrasikan dalam satu format ( ZIP , RAR , dll).

Meskipun mungkin ada sedikit keuntungan menggunakan tar dalam beberapa situasi karena penyimpanan metadata atau kemampuan untuk menambahkan file tambahan, ada juga kelemahannya. Dengan file gzip / bzip2 / xz biasa, Anda dapat mendekompresinya dan menyalurkan data yang telah dikompresi langsung ke alat lain (seperti database Anda) tanpa harus menyimpan data yang telah dikompresi sebagai file pada disk. Dengan tarball, ini lebih sulit.


2
Dengan tar GNU, hanya perlu -O beralih ke keluaran ke stdout, jadi saya tidak akan mengatakan itu jauh lebih sulit!
hyde

5
Paragraf pertama tampaknya cukup masuk akal untuk file yang menggunakan tgzekstensi. Namun, kasus OP menggunakan tar.gz- dan jika pengguna ex-Win / DOS yang hipotetis ini sama seperti saya, hal pertama yang mereka katakan ketika melihat file seperti itu adalah: 'Mengapa ia memiliki 2 ekstensi?'. Kemudian mereka mencari di Google dan dengan cepat mendapatkan jawabannya, yang secara khusus menjelaskan tardan kompresi berbeda. ;-)
underscore_d

17

Ada perbedaan penting yang dapat menjadikan penggunaan menjadi tarpenting dalam beberapa keadaan: Selain "metadata" yang @jofel sebutkan dalam jawabannya, tar mencatat nama file dalam arsip. Ketika Anda mengekstraknya, Anda mendapatkan nama file asli terlepas dari apa nama arsipnya.

Dalam kasus Anda, arsip tar dan file yang dikandungnya memiliki nama terkait db.dump.tar.gzdan db.tar, tetapi anggaplah Anda mengganti nama file tar tersebut 20-Apr-16.dump.tgz, atau apa pun. Hapus ini dengan tar xvfz, dan Anda dapatkan db.dump. Sebagai perbandingan, unzip 20-Apr-16.dump.gzdan Anda punya 20-Apr-16.dump. (Sunting: seperti yang ditunjukkan dalam komentar, gzip juga membuat catatan nama file; tetapi biasanya tidak digunakan saat membuka ritsleting). Sebuah tararsip juga dapat berisi pathname relatif yang menempatkan file diekstrak dalam subdirektori.

Kasus penggunaan Anda akan menentukan apakah jenis nama file ini diperlukan, atau bahkan diinginkan , atau sebenarnya tidak diinginkan. Namun yang pasti, terlepas dari kompresi, tararsip perjalanan berbeda dari file biasa.


6
gzip juga merekam nama file aslinya.
psusi

8
Ya. Namanya opsional di header gzip — jelas tidak akan ada jika Anda mengompresi keluaran streaming dari sebuah perintah — dan sebagian besar alat tidak akan mengembalikannya secara default (misalnya, Anda harus menggunakan gzip --namesecara eksplisit saat mendekompresi), tetapi Anda tidak harus menggunakan tar untuk mendapatkan ketekunan nama file.
Mil

Terima kasih telah menunjukkan ini, saya tidak tahu itu. Namun, karena itu bukan perilaku default, intinya adalah: Mendistribusikan file dalam format tar mempertahankan nama file asli (dan mungkin jalur relatif), tanpa campur tangan penerima. Mendistribusikan file (g) zip tidak.
alexis

8

Selain semua jawaban lain, saya baru-baru ini menemukan situasi scripting di mana hanya satu file diharapkan, tetapi karyawan sebelumnya menulis skrip dengan kemungkinan lebih dari satu file yang dihasilkan. Jadi file-file itu tar dan bzipped, kemudian ditransfer, dan diperluas.

Ketika proses tumbuh ke titik itu membuat file 4,3 GB, itu berguling dan membuat file .dump.001 di samping file .dump. Semua skrip terus bekerja.

Itu didefinisikan kemalasan sysadmin proaktif!


2

Saya akan tar file tunggal, untuk menyalinnya menjaga stempel waktu (yang mudah diabaikan dalam unduhan). Izin dan kepemilikan file kurang penting: unduhan adalah istilah yang berlaku untuk sistem yang tidak terintegrasi dengan baik.

Apakah tar atau tidak, itu adalah praktik standar untuk mengompres file untuk membuat unduhan lebih cepat - dan menghindari kehabisan ruang disk.


-1

Tar sangat berguna untuk banyak file yang tidak ditulis ke sistem file formal, seperti biasa. Jika karena alasan tertentu ada kesempatan, hanya 1 file yang akan ditulis itu tidak ada konsekuensi nyata. Saya dapat dd .tar.gz saya langsung ke / dev / sdx tanpa memperhatikan partisi atau sistem file. Mungkin juga rekaman.

Ini umumnya dilakukan karena skrip atau proses telah disalin dari kode warisan. Tentu saja tidak perlu tar jika hanya ada satu file, tetapi meninggalkan ruang untuk peningkatan ke beberapa file ......

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.