บีบอัดทุกไฟล์ในไดเรกทอรีเป็นไฟล์บีบอัดของตัวเอง


24

ฉันจะบีบอัดทุกไฟล์ในไดเรกทอรีเป็น tar ของตัวเองในขณะที่รักษาชื่อสำหรับแต่ละไฟล์

เช่น file1.out file2.out

->

file1.out.tar.gz file2.out.tar.gz

คำตอบ:


64

การวางทุกไฟล์ลงในไฟล์ tar แยกกันไม่สมเหตุสมผลในสถานการณ์นี้ คุณสามารถใช้gzipในการบีบอัดพวกเขาโดยตรง:

gzip *

จะส่งผลfile1.out.gzให้file2.out.gzฯลฯ

คุณจะใช้tarเฉพาะในกรณีที่คุณต้องการเก็บถาวรที่บีบอัดเป็นไฟล์เดียว

หากคุณจำเป็นต้องมีไฟล์เก็บถาวร tar สำหรับทุกไฟล์คุณสามารถสร้างมันขึ้นมาเพื่อ:

for i in *; do tar -czf $i.tar.gz $i; done

7
+1 - ไม่มีเหตุผลที่จะสร้าง tar (Tape ARchive) สำหรับไฟล์เดียว เพียงบีบอัดสิ่งที่คุณต้องการบีบอัด - ผลลัพธ์จะมีขนาดเล็กลงเล็กน้อยและทำให้ผู้ใช้สามารถแยกไฟล์ได้
voretaq7

หากต้องการ tar แต่ละไดเรกทอรีย่อย (ลึกเพียงระดับเดียว) แล้วลบต้นฉบับ:find . -maxdepth 1 -type d ! -path . | while read a_dir; do tar -zcvf ${a_dir}.tgz ${a_dir} --remove-files; done
xb

(ไม่สามารถแก้ไขความคิดเห็นของฉันด้านบนหลังจาก 5 นาที) รุ่นที่ง่ายขึ้น / ปลอดภัยยิ่งขึ้น:find . -maxdepth 1 -mindepth 1 -type d -exec tar -zcvf {}.tgz {} --remove-files \;
xb

9

หากต้องการสร้างคำตอบของ @ SvenW (ซึ่งจะใช้ได้กับไดเรกทอรีปัจจุบันเท่านั้น) หากคุณมีไฟล์จำนวนมากหรือต้องการทำในโครงสร้างไดเรกทอรีแบบเรียกซ้ำคุณสามารถใช้

find . -type f -exec gzip \{\} \;

และถ้าคุณต้องการใส่ผลลัพธ์ลงในไดเรกทอรีอื่น (ในตัวอย่างนี้../target) และไม่ต้องการลบต้นฉบับคุณสามารถทำสิ่งต่อไปนี้:

find . -type f -print | while read fname ; do
    mkdir -p "../target/`dirname \"$fname\"`"
    gzip -c "$fname" > "../target/$fname.gz"
done

1
find . -type f -exec gzip {} \;จะเพียงพอ รหัสที่สองจะล้มเหลวด้วยชื่อไฟล์ที่มีช่องว่างและไม่ชอบ
ผู้ใช้ไม่ทราบเมื่อ

กระสุนบางตัวไม่ชอบ {} s และตัวที่สองทำสิ่งที่แตกต่างอย่างชัดเจนจากครั้งแรก (และฉันทราบถึงปัญหาการเว้นวรรค แต่มันค่อนข้างยุ่งยากในการจัดการ)
ปุย

ถ้าคุณรู้ว่าเปลือกเช่นนี้ผมขอเชิญคุณที่จะตอบคำถามของฉันมากกว่าที่นี่: unix.stackexchange.com/questions/8647/... ไม่มีใครสามารถตั้งชื่อสิ่งที่วันนี้มีการใช้งานจนถึง หากคุณตระหนักถึงความเสี่ยงของคำตอบของคุณอาจเป็นความคิดที่ดีที่จะตั้งชื่อในคำตอบของคุณ
ไม่ทราบผู้ใช้

@userunknown ฉันถูกนำขึ้นมาบน (t) csh ซึ่งมีปัญหามากกับการจัดฟันแบบไม่มี{}การดึงในครั้งเดียวแม้ว่ามันจะไม่ปรากฏขึ้นอีกต่อไป อย่างไรก็ตามคนอื่น ๆ โพสต์ข้อความเหล่านั้นเป็นคำตอบสำหรับคำถามของคุณแล้ว
ปุย

หรือเพื่อบีบอัดไฟล์ที่ไม่ใช่ไบนารีทั้งหมด:find . -type f -exec grep -Iq . {} \; -and -exec gzip {} \;
xb

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.