ใช้ gzip เพื่อบีบอัดไฟล์ในไดเรกทอรียกเว้นไฟล์. gz ที่มีอยู่แล้ว


19

ฉันมีสมุดบันทึกที่ผมอยากจะตั้งค่าการงานในการบีบอัดโดยใช้gzip ปัญหาคือฉันไม่ต้องการบีบอัดบันทึกที่ฉันบีบอัดไว้แล้ว

ฉันพยายามใช้ls | grep -v gz | gzipแต่ดูเหมือนจะไม่ทำงาน

มีวิธีทำเช่นนี้หรือไม่? โดยทั่วไปฉันต้องการ gzip ทุกไฟล์ในไดเรกทอรีที่ไม่ได้ลงท้ายด้วย. gz

คำตอบ:


26

คุณสามารถทำได้:

gzip *

gzip จะบอกให้คุณข้ามไฟล์ที่มี.gz ตอนจบไปแล้ว
หากข้อความนั้นเข้ามาในแบบที่คุณสามารถใช้:

gzip -q *

สิ่งที่คุณพยายามใช้งานไม่ได้เพราะgzipไม่ได้อ่านชื่อไฟล์ของไฟล์ที่จะบีบอัดจาก stdin เพื่อให้ใช้งานได้คุณจะต้องใช้:

ls | grep -v gz | xargs gzip

คุณจะยกเว้นไฟล์ที่มีรูปแบบgzที่ใดก็ได้ในชื่อไฟล์ไม่ใช่แค่ในตอนท้าย¹คุณต้องทราบด้วยว่าการแยกเอาต์พุตของlsอันตรายเมื่อคุณมีชื่อไฟล์ที่มีช่องว่างบรรทัดใหม่และอื่น ๆ

วิธีแก้ไขที่สะอาดกว่าโดยไม่ต้องgzipข้ามไฟล์ที่มีจุด.gzสิ้นสุดคือจัดการไฟล์ที่ไม่ได้บีบอัดในไดเรกทอรีย่อย:

find .  -type f ! -name "*.gz" -exec gzip {} \;



¹ ตามที่izkataแสดงความคิดเห็น: ใช้.gzเพียงอย่างเดียวเพื่อปรับปรุงสิ่งนี้จะไม่ทำงาน คุณจะต้องใช้หรือgrep -vF .gz grep -v '\.gz$'นั่นยังคงเป็นอันตรายจากlsผลลัพธ์ของการประมวลผล


1
"... ที่ทำให้มีโอกาสน้อยกว่าที่จะจับคู่ส่วนภายในของชื่อไฟล์" - มันเป็น grep เพียงใช้$เพื่อให้ชัดเจนยิ่งขึ้น และคุณไม่ได้หลบหนี.ไปดังนั้นมันจะแยกไฟล์ที่ขึ้นต้นด้วยgz(เนื่องจากไม่มี "อักขระใด ๆ มาก่อนgz")
Izkata

1
@Izkata: ไม่รวมถึงจุดที่ไม่ได้ Escape และไม่ได้ยึด regex ด้วย$การยกเว้น ( -v) ไฟล์ทั้งหมดที่มีชื่อประกอบด้วยอักขระสามตัวขึ้นไปรวมถึงอักขระใด ๆ ตามด้วย "gz" ที่ใดก็ได้ในชื่อไฟล์ ดังนั้นจะรวมไฟล์ที่มีชื่อที่ขึ้นต้นด้วย "gz"
หยุดชั่วคราวจนกว่าจะมีการแจ้งให้ทราบต่อไป

1
@DennisWilliamson ความคิดเห็นสุดท้ายของฉันไม่ชัดเจนมันจะแยกไฟล์ที่มีgzชื่อใด ๆ (ยกเว้นจุดเริ่มต้น) ดังนั้นจึงเป็นการดีกว่าที่จะยึดไว้ หากไม่ได้ใช้$มันจะอ่านราวกับว่าคุณไม่ได้ตระหนักถึงความ.หมายของ regex ดังนั้นส่วนที่เหลือของความคิดเห็นที่สับสน
Izkata
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.