Linux gzip หลายไดเรกทอรีย่อยเป็นคลังเก็บแยก


16

ฉันจะบีบอัดไดเรกทอรีย่อยเป็นไฟล์เก็บถาวรแยกกันได้อย่างไร

ตัวอย่าง:

directory
 subdir1
 subdir2

ควรสร้าง subdir1 (.tar) .gz และ subdir2 (.tar) .gz

คำตอบ:


27

สคริปต์ขนาดเล็กนี้ดูเหมือนจะเป็นตัวเลือกที่ดีที่สุดตามความต้องการของคุณ:

cd directory
for dir in */
do
  base=$(basename "$dir")
  tar -czf "${base}.tar.gz" "$dir"
done

มันจัดการกับไดเรกทอรีที่มีช่องว่างอย่างถูกต้องในชื่อของพวกเขา


มันทำให้ฉันมีข้อผิดพลาดนี้: ทุบตี: -c: บรรทัดที่ 1: ข้อผิดพลาดทางไวยากรณ์: จุดสิ้นสุดของไฟล์ที่ไม่คาดคิด
EarthMind

@ EarthMind: มันทำงานได้ดีที่นี่ ตรวจสอบว่าสคริปต์ถูกคัดลอกอย่างถูกต้อง
Juliano

@ EarthMind: ฉันไม่แน่ใจว่าคุณสะกดคำถามเดิมได้ดีแล้ว คุณต้องการเรียกใช้งานอีกครั้งและรับไฟล์. tar.gz ใหม่ขณะที่ปล่อยไฟล์. tar.gz ก่อนหน้าเพียงอย่างเดียวหรือไม่ ลองเพิ่ม "tmstamp = $ (วันที่ '+% Y% m% d-% H% M')" และเปลี่ยน $ {base} เป็น $ {base} - $ {tmstamp}
Freiheit

2
@EarthMind: ถ้าคุณจะใส่ทุกอย่างไว้ในบรรทัดเดียวตรวจสอบให้แน่ใจว่ามีเครื่องหมายอัฒภาค (;) อยู่หน้าคำสั่ง tar มิฉะนั้นฐานจะถูกส่งผ่านเป็นตัวแปรสภาพแวดล้อมเพื่อ tar แทนที่จะเป็นตัวแปรเสริมเปลือก
Juliano

@mwojtera แก้ไขความพยายามของคุณควรจะเป็นคำตอบของตัวเอง
ลูกไก่

10

เกี่ยวกับสิ่งนี้: find * -maxdepth 0 -type d -exec tar czvf {}.tar.gz {} \;

คำอธิบาย:คุณรันการค้นหาในทุกรายการในไดเรกทอรีปัจจุบัน Maxdepth 0 ทำให้ไม่เรียกคืนต่ำกว่าอาร์กิวเมนต์ที่กำหนด (ในกรณีนี้ * หรือรายการทั้งหมดในไดเรกทอรีปัจจุบันของคุณ) อาร์กิวเมนต์ 'd' เป็น "-type" จะจับคู่กับไดเรกทอรีเท่านั้น จากนั้นผู้บริหารจะรัน tar ในสิ่งที่ตรงกัน ({} ถูกแทนที่ด้วยไฟล์ที่ตรงกัน)


1
แต่แล้วฉันก็ยังคงได้รับข้อผิดพลาดที่เส้นทางที่กำหนดเป็นไดเรกทอรีและไม่ได้เป็นไฟล์
EarthMind

3
gzip เพียงอย่างเดียวไม่ได้เก็บไดเรกทอรีไว้
Juliano

คุณต้อง tar ไดเรกทอรีก่อนที่คุณจะสามารถ gzip พวกเขา
ℝaphink

1
คุณต้องการ tar ด้วยตัวเลือก z ไม่ใช่ gzip แบบตรงสำหรับไดเรกทอรี แม้ว่าการใช้งาน find เป็นสิ่งที่ดีมาก
Freiheit

3
ข้อผิดพลาด: "ค้นหา: พา ธ ต้องนำหน้านิพจน์:;" ส่วนแรกใช้งานได้ดังนั้นฉันใช้ (ไดเรกทอรีเท่านั้น): for dir in `find * -maxdepth 0 -type d`; do tar -cvzf ${dir}.tar.gz ${dir}; done
JosephK

4

สิ่งนี้จะสร้างไฟล์ชื่อ blah.tar.gz สำหรับแต่ละไฟล์ในไดเรกทอรีที่ชื่อ blah

$ cd directory
$ for dir in `ls`; do tar -cvzf ${dir}.tar.gz ${dir}; done

หากคุณมีมากกว่าไดเรกทอรีในไดเรกทอรี (เช่นไฟล์เช่น ls จะส่งคืนทุกสิ่งในไดเรกทอรี) จากนั้นใช้สิ่งนี้:

$ cd directory
$ for dir in `find . -maxdepth 1 -type d  | grep -v "^\.$" `; do tar -cvzf ${dir}.tar.gz ${dir}; done

grep -v ไม่รวมไดเรกทอรีปัจจุบันซึ่งจะปรากฏในfindคำสั่งโดยค่าเริ่มต้น


3
ทั้ง ls และ find ไม่ได้ถูกสร้างขึ้นเพื่อใช้ในวิธีนี้ ls เป็นพิเศษมีวัตถุประสงค์เพื่อนำเสนอไฟล์ในรายการที่ผู้ใช้อ่านได้ไม่สร้างรายการไฟล์เป็นอาร์กิวเมนต์สำหรับ 'สำหรับ' เพียงใช้for dir in *
Juliano

1
ฉันได้ลองคำแนะนำแรกของคุณแล้ว แต่มันไม่ได้ทำงานกับไดเรกทอรีที่มีช่องว่างในชื่อของพวกเขา
EarthMind

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