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 ของฉันอาจไม่ใช่สิ่งที่เป็นไปได้มันอาจเป็นไปได้ที่จะข้ามไปหาโดยตรง
*.*
ในls
?