วิธีสร้างไฟล์ gzip ที่ไม่มีนามสกุลไฟล์. gz


14

ฉันต้องการสร้างไฟล์ gzipped ที่เก็บชื่อไฟล์ดั้งเดิมไว้ ตัวอย่างเช่น gzipping "example.txt" ควรส่งออกไฟล์ gzipped ชื่อ "example.txt" แทนที่จะเป็น "example.txt.gz" เป็นไปได้ไหมที่จะทำสิ่งนี้อย่างงดงามด้วยคำสั่งเดียว (ไม่ทำตามมาmv)?


4
ฉันอยากรู้อยากเห็นเล็กน้อย ทำไมคุณต้องการสิ่งนี้ ดูเหมือนความคิดที่ไม่ดี
Bernhard

3
ใช่. คุณใส่ทั้งสองบรรทัดในสคริปต์ทุบตีและเรียกมันว่า "คำสั่ง my-elegant-command" ;)
goldilocks

2
@Bernhard เป็นส่วนหนึ่งของกระบวนการสร้างการรวมอย่างต่อเนื่องสำหรับเว็บแอป ต้องบีบอัดสินทรัพย์แบบคงที่ (CSS, JS ไฟล์) โดยไม่ต้องเปลี่ยนชื่อไฟล์ เมื่อส่งไปยังเบราว์เซอร์จะมีส่วนหัว "การเข้ารหัสเนื้อหา: gzip" เพื่อให้ส่วนขยายไม่เกี่ยวข้อง แต่ถ้าชื่อไฟล์มีการเปลี่ยนแปลงฉันต้องทำการค้นหาและแทนที่ในไฟล์ HTML ต้นทาง
jamieb

หากนี่เป็นปัญหาที่มากสำหรับคุณคุณสามารถกำหนดฟังก์ชั่นทุบตีที่ส่ง $ * ไปยังไฟล์เรียกทำงาน gzip และบรรทัดที่สองทำ mv ให้คุณ
Bratchley

4
@ ปัญหาแอปพลิเคชันเว็บของคุณ: เว็บเซิร์ฟเวอร์ใด ๆ ที่ดีสามารถ / จะทำการบีบอัดให้คุณ ...
Bananguin

คำตอบ:


12

สิ่งนี้ไม่ทำงาน:

# 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ประสบความสำเร็จ นั่นเป็นวิธีที่ง่ายที่สุดง่ายต่อการเข้าใจและน่าเชื่อถือที่สุดที่คุณจะพบ


1
วิธีการเกี่ยวกับการเพิ่มเพื่อความสมบูรณ์:gzip example.txt && mv example.txt.gz example.txt
depquid

2
ไม่ต้องอ่าน OP ไม่ต้องรอ
goldilocks

@goldilocks "สร้างไฟล์แยกต่างหากและmvสำเร็จ" สามารถทำให้สง่างามมากขึ้น? ฉันแค่พยายามเสนอว่าคำตอบของ frostschutz จะเพิ่มขึ้นด้วยตัวอย่างที่เฉพาะเจาะจง หากmvสามารถใช้งานได้อย่างหรูหรากว่าที่ฉันคิดไว้โปรดยกตัวอย่าง
ตัดสิทธิ์

ข้อเสนอแนะของคุณคือวิธีการที่เรียบง่ายสง่างามและชัดเจน แต่ไม่ว่ามันจะขึ้นอยู่กับตัวแปรมากมายเช่นคุณจะทำอย่างไรถ้ามีตัวอย่างอยู่แล้ว txt.gz? นอกจากนี้เมื่อไม่มีส่วนขยายที่จะทำงานด้วยคุณต้องป้องกันไฟล์ gzipping แล้ว gzipped อย่างใด นั่นเป็นหนอนกระป๋องใหม่ทั้งหมด แต่นั่นไม่ได้เป็นส่วนหนึ่งของคำถาม
frostschutz

10

ฉันมีปัญหาเดียวกันเนื่องจากเป็นส่วนหนึ่งของ CI ที่ปรับใช้กับ AWS S3

นี่คือสิ่งที่ฉันทำเพื่อเรียกไดเรกทอรีซ้ำ (โดยใช้) ซ้ำโดยไม่มี.gzคำต่อท้าย:

find . -type f -exec gzip "{}" \; -exec mv "{}.gz" "{}" \;

ดูเหมือนจะสะอาดพอสำหรับฉัน แต่ดูเหมือนว่าคุณต้องการมีmvในบางแห่ง

หากคุณกำลังใช้คุณอาจจะมองไปที่grunt grunt-contrib-compressบางส่วนของgruntเครื่องมือเฉพาะสำหรับนำไปใช้กับ S3 จะจัดการ gzip ให้คุณด้วย


1
ควรจะfind . -type ...ไม่find.เพิ่มพื้นที่โปรด :)
Humdinger

2

-S นามสกุลที่คุณต้องการ

gzip -S "`_date +%Y_%M' dog.txt 

จะส่งผลให้ dog.txt_2015_11

เมื่อคุณคลายซิปมันคุณจะต้องระบุนามสกุล

gzip -d _2015_11 dog.txt_2015_11

ในระบบปฏิบัติการยูนิกซ์ใช้คำสั่ง file เพื่อกำหนดประเภทของไฟล์ที่คุณมีนามสกุลถูกทำให้เข้าใจผิดหรือหายไปบ่อยครั้ง


1

ฉันไม่คิดว่าการสร้างไฟล์ gzip โดยไม่มีนามสกุลเป็นสิ่งที่ควรทำ

IMHo คุณควรกำหนดค่าเว็บเซิร์ฟเวอร์ของคุณเพื่ออ่านไฟล์. gz คุณอาจมีกฎเช่นนี้อยู่แล้ว:

Path asets/:
  If header Accept-Encoding contains "gzip" and not contains "gzip;q=0":
    Add header Content-Encoding: gzip

คุณเพียงแค่ต้องเพิ่มกฎการเขียนชื่อไฟล์ที่ร้องขอเพื่อต่อท้าย ".gz" (จริง ๆ แล้วคุณควรตรวจสอบว่าไฟล์นั้นมีอยู่เช่นเดียวกับที่คุณควรตรวจสอบว่าลูกค้าทำรายการ gzip ในส่วนหัวยอมรับการเข้ารหัส)


1

คุณสามารถลองs3_websiteสำหรับสิ่งนี้

ฉันไม่ชอบความจริงที่เขียนทั้งแบบสกาล่าและทับทิมและมันต้องการ JVM นอกจากนี้ฉันไม่ชอบสมมติฐานที่ทำให้ (โดยเฉพาะอย่างยิ่งความจริงที่ว่ามันลบไฟล์พิเศษจากที่เก็บข้อมูล) แต่มันควรจะทำงานได้ถ้าคุณพอใจกับมัน

ฉันวางแผนที่จะเขียนเครื่องมือดังกล่าวด้วยตัวเองที่ไม่มีข้อ จำกัด เหล่านี้คอยติดตาม


0

นี่ไม่ใช่สิ่งที่คุณควรทำจริง ๆ ส่วนใหญ่เป็นเพราะเมื่อถ่ายโอนไฟล์นี้ไปยังระบบหรือบุคคลอื่นมันอาจทำให้สับสนและไม่พบว่าเป็นไฟล์บีบอัด

หากคุณไม่ต้องการที่จะใช้ต่อท้ายใด ๆ แล้ว 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 ได้กล่าวมามันไม่ควรทำเช่นนี้


นี่คือสิ่งที่จำเป็นถ้าคุณต้องการใช้ S3 สำหรับการบริการไฟล์บีบอัดเช่นสำหรับโฮสต์เว็บไซต์แบบคงที่ คุณอาจพิจารณาสิ่งนี้: github.com/laurilehmijoki/s3_website
Cristian Măgherușan-Stanciu
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.