คำตอบ:
คุณสามารถทำได้:
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
ผลลัพธ์ของการประมวลผล
$
การยกเว้น ( -v
) ไฟล์ทั้งหมดที่มีชื่อประกอบด้วยอักขระสามตัวขึ้นไปรวมถึงอักขระใด ๆ ตามด้วย "gz" ที่ใดก็ได้ในชื่อไฟล์ ดังนั้นจะรวมไฟล์ที่มีชื่อที่ขึ้นต้นด้วย "gz"
gz
ชื่อใด ๆ (ยกเว้นจุดเริ่มต้น) ดังนั้นจึงเป็นการดีกว่าที่จะยึดไว้ หากไม่ได้ใช้$
มันจะอ่านราวกับว่าคุณไม่ได้ตระหนักถึงความ.
หมายของ regex ดังนั้นส่วนที่เหลือของความคิดเห็นที่สับสน
$
เพื่อให้ชัดเจนยิ่งขึ้น และคุณไม่ได้หลบหนี.
ไปดังนั้นมันจะแยกไฟล์ที่ขึ้นต้นด้วยgz
(เนื่องจากไม่มี "อักขระใด ๆ มาก่อนgz
")