ฉันต้องการสร้างไฟล์ gzipped ที่เก็บชื่อไฟล์ดั้งเดิมไว้ ตัวอย่างเช่น gzipping "example.txt" ควรส่งออกไฟล์ gzipped ชื่อ "example.txt" แทนที่จะเป็น "example.txt.gz" เป็นไปได้ไหมที่จะทำสิ่งนี้อย่างงดงามด้วยคำสั่งเดียว (ไม่ทำตามมาmv
)?
ฉันต้องการสร้างไฟล์ gzipped ที่เก็บชื่อไฟล์ดั้งเดิมไว้ ตัวอย่างเช่น gzipping "example.txt" ควรส่งออกไฟล์ gzipped ชื่อ "example.txt" แทนที่จะเป็น "example.txt.gz" เป็นไปได้ไหมที่จะทำสิ่งนี้อย่างงดงามด้วยคำสั่งเดียว (ไม่ทำตามมาmv
)?
คำตอบ:
สิ่งนี้ไม่ทำงาน:
# echo Hello World > example.txt
# gzip < example.txt > example.txt # WRONG!
# file example.txt
example.txt: gzip compressed data, from Unix, last modified: Thu Mar 21 19:45:29 2013
# gunzip < example.txt
<empty file>
นี่คือสภาพการแข่งขัน:
# echo Hello World > example.txt
# dd if=example.txt | gzip | dd of=example.txt # still WRONG!
# gunzip < example.txt
Hello World # may also be empty
ปัญหาคือว่า> example.txt
(หรือdd of=example.txt
สำหรับเรื่องนั้น) ฆ่าไฟล์ก่อนที่กระบวนการอื่นมีโอกาสที่จะอ่านมัน mv
ดังนั้นจึงไม่มีทางออกที่ชัดเจนซึ่งเป็นเหตุผลที่คุณควรจะติด
มีหลายวิธีที่คุณสามารถโกงได้ คุณสามารถเปิดไฟล์จากนั้นยกเลิกการเชื่อมโยง - ไฟล์จะยังคงอยู่จนกว่าคุณจะปิด - จากนั้นสร้างไฟล์ใหม่ด้วยชื่อเดียวกันและเขียนข้อมูล gzipped ลงไป อย่างไรก็ตามฉันไม่ทราบวิธีที่ชัดเจนในการบีบบังคับที่จะใช้และแม้ว่าฉันจะทำเช่นนั้นคำตอบของฉันก็ยังคงเป็น:
อย่าทำมันด้วยซ้ำ
หากgzip
ล้มเหลวด้วยเหตุผลใด ๆ หรือปัญหาใด ๆ เกิดขึ้นเช่นคุณหมดพื้นที่ในขณะที่ gzipping (เพราะกระบวนการอื่นกำลังเขียนหรือผล gzip มีขนาดใหญ่กว่าการป้อนข้อมูล - ที่เกิดขึ้นสำหรับข้อมูลแบบสุ่ม - ฯลฯ ) คุณสูญเสียไฟล์ของคุณ . ขอแสดงความยินดี!
สร้างไฟล์แยกต่างหากและmv
ประสบความสำเร็จ นั่นเป็นวิธีที่ง่ายที่สุดง่ายต่อการเข้าใจและน่าเชื่อถือที่สุดที่คุณจะพบ
gzip example.txt && mv example.txt.gz example.txt
mv
สำเร็จ" สามารถทำให้สง่างามมากขึ้น? ฉันแค่พยายามเสนอว่าคำตอบของ frostschutz จะเพิ่มขึ้นด้วยตัวอย่างที่เฉพาะเจาะจง หากmv
สามารถใช้งานได้อย่างหรูหรากว่าที่ฉันคิดไว้โปรดยกตัวอย่าง
ฉันมีปัญหาเดียวกันเนื่องจากเป็นส่วนหนึ่งของ CI ที่ปรับใช้กับ AWS S3
นี่คือสิ่งที่ฉันทำเพื่อเรียกไดเรกทอรีซ้ำ (โดยใช้) ซ้ำโดยไม่มี.gz
คำต่อท้าย:
find . -type f -exec gzip "{}" \; -exec mv "{}.gz" "{}" \;
ดูเหมือนจะสะอาดพอสำหรับฉัน แต่ดูเหมือนว่าคุณต้องการมีmv
ในบางแห่ง
หากคุณกำลังใช้คุณอาจจะมองไปที่grunt
grunt-contrib-compress
บางส่วนของgrunt
เครื่องมือเฉพาะสำหรับนำไปใช้กับ S3 จะจัดการ gzip ให้คุณด้วย
find . -type ...
ไม่find.
เพิ่มพื้นที่โปรด :)
-S
นามสกุลที่คุณต้องการ
gzip -S "`_date +%Y_%M' dog.txt
จะส่งผลให้ dog.txt_2015_11
เมื่อคุณคลายซิปมันคุณจะต้องระบุนามสกุล
gzip -d _2015_11 dog.txt_2015_11
ในระบบปฏิบัติการยูนิกซ์ใช้คำสั่ง file เพื่อกำหนดประเภทของไฟล์ที่คุณมีนามสกุลถูกทำให้เข้าใจผิดหรือหายไปบ่อยครั้ง
ฉันไม่คิดว่าการสร้างไฟล์ gzip โดยไม่มีนามสกุลเป็นสิ่งที่ควรทำ
IMHo คุณควรกำหนดค่าเว็บเซิร์ฟเวอร์ของคุณเพื่ออ่านไฟล์. gz คุณอาจมีกฎเช่นนี้อยู่แล้ว:
Path asets/:
If header Accept-Encoding contains "gzip" and not contains "gzip;q=0":
Add header Content-Encoding: gzip
คุณเพียงแค่ต้องเพิ่มกฎการเขียนชื่อไฟล์ที่ร้องขอเพื่อต่อท้าย ".gz" (จริง ๆ แล้วคุณควรตรวจสอบว่าไฟล์นั้นมีอยู่เช่นเดียวกับที่คุณควรตรวจสอบว่าลูกค้าทำรายการ gzip ในส่วนหัวยอมรับการเข้ารหัส)
คุณสามารถลองs3_websiteสำหรับสิ่งนี้
ฉันไม่ชอบความจริงที่เขียนทั้งแบบสกาล่าและทับทิมและมันต้องการ JVM นอกจากนี้ฉันไม่ชอบสมมติฐานที่ทำให้ (โดยเฉพาะอย่างยิ่งความจริงที่ว่ามันลบไฟล์พิเศษจากที่เก็บข้อมูล) แต่มันควรจะทำงานได้ถ้าคุณพอใจกับมัน
ฉันวางแผนที่จะเขียนเครื่องมือดังกล่าวด้วยตัวเองที่ไม่มีข้อ จำกัด เหล่านี้คอยติดตาม
นี่ไม่ใช่สิ่งที่คุณควรทำจริง ๆ ส่วนใหญ่เป็นเพราะเมื่อถ่ายโอนไฟล์นี้ไปยังระบบหรือบุคคลอื่นมันอาจทำให้สับสนและไม่พบว่าเป็นไฟล์บีบอัด
หากคุณไม่ต้องการที่จะใช้ต่อท้ายใด ๆ แล้ว GNU ไม่ดีสำหรับคุณเป็นจะกลับมาเป็นgzip -S ""
gzip: invalid suffix ''
อย่างไรก็ตามคุณสามารถส่งบางสิ่งเช่นgzip -S " "
(ช่องว่าง) ได้ตลอดเวลาและจะแสดงดังนี้:
$ file testfile\
testfile: gzip compressed data, was "testfile", from Unix, last modified: Tue Jun 3 XX:XX:XX 2014
หลังจากนั้นถ้าคุณต้องการขยายมันคุณจะต้องทำบางสิ่งเช่นgunzip -c testfile\
(โดยไม่ต้องระบุคำต่อท้าย) หรือแม้กระทั่งด้วยการ-f
ตั้งค่าสถานะ
ฉันคิดอย่างจริงใจว่าการเพิ่มmv
คำสั่งด้วย&&
จะไม่ทำให้รหัสของคุณยุ่งยากมากนัก อย่างไรก็ตามและตามที่ @frostschutz ได้กล่าวมามันไม่ควรทำเช่นนี้