gzip ไฟล์ทั้งหมดโดยไม่ต้องลบ


11

ฉันต้อง gzip ไฟล์ทั้งหมดใน dir แยกต่างหากรวมถึงไฟล์ทั้งหมดในไดเรกทอรีย่อยโดยไม่ต้องลบต้นฉบับในภายหลัง สมมุติว่าฉันมี index.html ฉันอยากได้ที่ท้าย index.html.gzip AND index.html

ฉันสามารถ gzip ไฟล์ทั้งหมดใน dir ของฉันผ่าน

gzip -r .

แต่ฉันต้องการเก็บไฟล์ต้นฉบับไว้ด้วย

เป็นไปได้ไหม

คำตอบ:


9
find . -type f | \
while read -r x
do
  gzip -c "$x" > "$x.gz"
done

การ-cผลักผลลัพธ์จะ stdout และเก็บต้นฉบับไว้คนเดียว ข้อเสียคือคุณต้องค้นหาไฟล์ด้วยตัวเอง สำหรับการสำรวจที่ซับซ้อนยิ่งขึ้นคุณสามารถใช้find(1)อย่างไรก็ตามเช่นด้านบน: .การค้นหาเริ่มต้นจากไดเรกทอรีปัจจุบันและ-type fส่งคืนชื่อของทุกไฟล์ปกติ


ทำไม*.*ในls?

@pooh: *.*จับคู่ไฟล์ที่มีชื่อเป็นประจำทั้งหมดและมักจะไม่มีไดเรกทอรี แน่นอนมันใช้งานได้ในกรณีส่วนใหญ่และมักจะไม่ถ้าคุณต้องการมัน จากนั้นใช้findคำสั่ง
Boldewyn

@Boldewyn: คำถามคือการ gzip ไฟล์ทั้งหมดใน dir ls *.*จะไม่รับไฟล์เช่นสิ่งที่ต้องทำ

lsไม่จำเป็นที่ทุกคนfor x in * : อย่างไรก็ตามการใช้ควรจะเป็นfind find . -type f | while read -r x
หยุดชั่วคราวจนกว่าจะมีการแจ้งให้ทราบต่อไป

อัปเดตคำตอบ ขอบคุณสำหรับสวิทช์-r read
Boldewyn

5
find . -type f -not \( -name '*.gz' -or -name '*[~#]' \) -exec sh -c 'gzip -c "{}" > "{}.gz"' \;

คุณสามารถสลับไปมาได้อย่างง่ายดายเพื่อรวมสิ่งที่คุณต้องการบีบอัด ( -name '*.txt -or -name '*.htmlฯลฯ ) แทนที่จะเป็นเหมือนตอนนี้ไม่รวมไฟล์บางไฟล์ (บีบอัดแล้วสำรองข้อมูลและไฟล์ชั่วคราว)

จัดการช่องว่างในชื่อไฟล์ก็ใช้ได้เช่นกัน

เปลี่ยนgzipเป็น echo gzipสำหรับการทดสอบ หรือข้ามส่วน -exec ทั้งหมดเข้าด้วยกัน

แก้ไข:โอ้ฉันลืมที่จะพูดถึงว่านี่ไม่ได้ตรวจสอบว่า<target>.gzมีอยู่แล้ว สิ่งนี้อาจจะใช่หรือไม่ใช่ปัญหา

แก้ไข 2:โอเคที่นี่เราไปกับสิ่งที่ตรวจสอบไฟล์ที่มีอยู่ หากว่าอาจจะต้องการ ให้อภัยความไม่ลงรอยกัน

while read file; do if [ ! -f "$file.gz" ]; then echo "Compressing $file"; gzip -c "$file" > "$file.gz"; else echo "Not overwriting $file.gz";  fi  done < <(find . -type f -not \( -name '*.gz' -or -name '*[~#]' \))

find-foo ของฉันอาจไม่ใช่สิ่งที่เป็นไปได้มันอาจเป็นไปได้ที่จะข้ามไปหาโดยตรง


1
แค่อ่านว่า -name ควรมาก่อน -type เพื่อหลีกเลี่ยงการเรียก stat ในทุก ๆ ไฟล์

@ Ben ทำให้รู้สึกเข้าที่ดี! สำหรับต้นไม้ขนาดใหญ่อาจสังเกตได้
ทุนดรา

2

เพียงเพิ่มตัวเลือก -c ฉันคิดว่านี่น่าจะใช้ได้


1
อาจใช้งานได้เฉพาะเมื่อ gzipping ไฟล์ครั้งละหนึ่งไฟล์เท่านั้น
its_me


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