سؤال كيفية تحديد مستوى الضغط عند استخدام tar -zcvf؟


أنا gzip أدلة في كثير من الأحيان في العمل. ما أفعله عادة هو

tar -zcvf file.tar.gz /path/to/directory

هل هناك طريقة لتحديد مستوى الضغط هنا؟ أرغب في استخدام أفضل ضغط ممكن حتى إذا استغرق المزيد من الوقت لضغط.


125
2017-07-01 18:00


الأصل




الأجوبة:


GZIP=-9 tar cvzf file.tar.gz /path/to/directory

على افتراض أنك تستخدم باش. بشكل عام ، قم بتعيين متغير بيئة GZIP إلى "-9" ، وقم بتشغيل tar عادة.

أيضًا - إذا كنت تريد بالفعل أفضل ضغط ، فلا تستخدم gzip. استخدم lzma أو 7z.

وعند استخدام gzip (وهي فكرة جيدة للعديد من الأسباب على أي حال) فكر في استخدام pigz البرنامج وليس gzip.


124
2017-07-01 18:38



pigz هو "gzip متوازي" والذي يستخدم جميع النوى الخاصة بك لضغط gzip. يمكنك المشاهدة top ونرى ذلك باستخدام أي مكان بين 200 ٪ -400 دولار وحدة المعالجة المركزية. - Felipe Alvarez
لمعلوماتك ، لتنسيق .bz2 ، استخدم: BZIP2 = -9 tar cvjf file.tar.bz2 / المسار / إلى / الدليل - Tomofumi
يبدو متغير البيئة الآن GZIP_OPT، يجب أن يكون الاستخدام هو نفسه. - Seer
من صفحة man على Ubuntu 16.04 لـ gzip: "On Vax / VMS ، اسم متغير البيئة هو GZIP_OPT ، لتجنب تعارض مع مجموعة الرموز لاستدعاء البرنامج." بالنسبة إلى sh و csh و MSDOS ، يجب أن يكون GZIP فقط - Ponyboy47


بدلاً من استخدام علامة gzip للقطران ، يمكنك gzip الملفات يدويًا بعد عملية tar ، فيمكنك عندئذٍ تحديد مستوى الضغط لبرنامج gzip:

tar -cvf files.tar /path/to/file0 /path/to/file1 ; gzip -9 files.tar

أو يمكنك استخدام:

tar cvf - /path/to/file0 /path/to/file1 | gzip -9 - > files.tar.gz

يخبر -9 في سطر الأوامر gzip gzip لاستخدام أقصى مستوى ضغط ممكن (الافتراضي هو -6).

تصحيح: خط قيادة الأنبوب الثابت يعتمد على تعليقdepesz.


62
2017-07-01 18:25



استخدام الأنابيب يجب أن يتم مع: tar cvf - /path/to/directory | gzip -9 - > file.tar.gz
يجب أن ينتهي المثال الأول بـ file.tar، منذ gzip يضيف الامتداد ".gz". - bonsaiviking
لماذا لا تخطي f -؟ إذا لم يكن هناك ملف ، فهو stdin / out - akostadinov
بالإضافة إلى تعليق previos. من قسم "man tar" Environtment: TAPE Device أو file to use for the archive if --file not specified. إذا لم يتم تعيين متغير البيئة هذا ، استخدم stdin أو stdout بدلاً من ذلك. - Mikl
ويمكننا تقليل "gzip -9 -" -> "gzip -9". من قسم "man gzip" الوصف: إذا لم يتم تحديد أي ملفات ، أو إذا كان اسم الملف "-" ، يتم ضغط الإدخال القياسي إلى الإخراج القياسي. - Mikl


الإصدارات الحديثة من القطران تدعم تنسيق أرش xz (GNU tar ، منذ 1.22 في عام 2009 ، Busybox منذ 1.17.0 في 2010).

انها تقوم على lzma2، نوع من مثل 7 زيب نسخة من جي زد. وهذا يعطي ضغطًا أفضل إذا كنت على ما يرام مع متطلبات الحاجة إلى دعم xz.

tar -Jcvf file.tar.xz /path/to/directory

أنا فقط وجدت بها هنا (في الأساس ، من هذا السؤال ، ولكن في stackexchange يونكس) أن هناك أيضا XZ_OPT = -9 متغير بيئة للتحكم في مستوى ضغط XZ مماثلة لواحد GZIP في وظيفة أخرى.

XZ_OPT=-9 tar -Jcvf file.tar.xz /path/to/directory

44
2017-12-19 03:03



+1 xz أفضل بكثير من كل من bzip2 و gzip. وهنا مقارنة: tukaani.org/lzma/benchmarks.html - User1
المقايضة هي السرعة. XZ هو بشكل كبير أبطأ. - Bell


tar cv /path/to/directory | gzip --best > file.tar.gz

هذا هو الحل الثاني لماتريكس Mole ، ولكن اختصار قليلا:

عند استدعاء القطران ، الخيار f تنص على أن الإخراج هو ملف. وضعه ل - (stdout) يجعل tar يكتب مخرجه إلى stdout وهو السلوك الافتراضي بدون كليهما f و -.

وكما ذكرت من قبل gzip الصفحة رجل ، إذا تم تحديد أي ملفات gzip سوف ضغط من الإدخال القياسي. ليست هناك حاجة ل - في ال gzip مكالمة.

اختيار --best (أي ما يعادل -9) يحدد أعلى مستوى للضغط.


28
2018-02-04 18:17



هذا يعمل بشكل جميل. أيضا إذا قمت بتشغيل كجذر ، يتم الاحتفاظ الأذونات والمالكين أيضا. خلاف ذلك يجب عليك تحديد. أيضا إذا لم يكن واضحا "-9" هو أفضل ضغط و "-1" هو ضغط أسرع. "-1" لا يزال يستغرق وقت looong إذا كان لديك الكثير من الملفات ؛-) - PJ Brunet
هذا يعمل مع xz و pixz جدا. إنها طريقة رائعة للتحكم في عدد مؤشرات الترابط المستخدمة للضغط المتوازي دون الحاجة إلى إنشاء ملف .tar متوسط. مثل ذلك tar -cv /path/to/dir | pixz -p4 > output.tpxz - joelostblom


هناك أيضا خيار لتحديد برنامج ضغط باستخدام -I. يمكن أن يتضمن ذلك خيار مستوى الضغط.

tar -I 'gzip -9' -cvf file.tar.gz /path/to/directory

10
2018-06-21 04:21



لا تدعم الإصدارات الأقدم من القطران مثل تلك الواردة في CentOS 6 & 7 تقديم الحجج في -I arg ، سيحاولون معاملة الأمر برمته كاسم برنامج للتنفيذ ، وبالتالي يفشلون. على الأقل اعتبارًا من قطر 1.29 في Debian Stretch ، فهذا يعمل. - Cheetah