ฉันจะบีบอัดทุกไฟล์ในไดเรกทอรีเป็น tar ของตัวเองในขณะที่รักษาชื่อสำหรับแต่ละไฟล์
เช่น file1.out file2.out
->
file1.out.tar.gz file2.out.tar.gz
ฉันจะบีบอัดทุกไฟล์ในไดเรกทอรีเป็น tar ของตัวเองในขณะที่รักษาชื่อสำหรับแต่ละไฟล์
เช่น file1.out file2.out
->
file1.out.tar.gz file2.out.tar.gz
คำตอบ:
การวางทุกไฟล์ลงในไฟล์ tar แยกกันไม่สมเหตุสมผลในสถานการณ์นี้ คุณสามารถใช้gzip
ในการบีบอัดพวกเขาโดยตรง:
gzip *
จะส่งผลfile1.out.gz
ให้file2.out.gz
ฯลฯ
คุณจะใช้tar
เฉพาะในกรณีที่คุณต้องการเก็บถาวรที่บีบอัดเป็นไฟล์เดียว
หากคุณจำเป็นต้องมีไฟล์เก็บถาวร tar สำหรับทุกไฟล์คุณสามารถสร้างมันขึ้นมาเพื่อ:
for i in *; do tar -czf $i.tar.gz $i; done
find . -maxdepth 1 -type d ! -path . | while read a_dir; do tar -zcvf ${a_dir}.tgz ${a_dir} --remove-files; done
find . -maxdepth 1 -mindepth 1 -type d -exec tar -zcvf {}.tgz {} --remove-files \;
หากต้องการสร้างคำตอบของ @ 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
find . -type f -exec gzip {} \;
จะเพียงพอ รหัสที่สองจะล้มเหลวด้วยชื่อไฟล์ที่มีช่องว่างและไม่ชอบ
{}
การดึงในครั้งเดียวแม้ว่ามันจะไม่ปรากฏขึ้นอีกต่อไป อย่างไรก็ตามคนอื่น ๆ โพสต์ข้อความเหล่านั้นเป็นคำตอบสำหรับคำถามของคุณแล้ว
find . -type f -exec grep -Iq . {} \; -and -exec gzip {} \;
ลองอันนี้:
#!/bin/bash
for fich in *; do
if [ "$fich" != "*" ] ; then
gzip -9 -c $fich > $fich.tar.gz
\mv $fich.tar.gz $fich
fi
done