จะบอก gzip ให้เก็บไฟล์ต้นฉบับได้อย่างไร


210

ฉันต้องการบีบอัดไฟล์ข้อความโดยใช้เครื่องมือบรรทัดคำสั่ง gzip ในขณะที่เก็บไฟล์ต้นฉบับไว้ โดยค่าเริ่มต้นเรียกใช้คำสั่งต่อไปนี้

gzip file.txt

file.txt.gzผลลัพธ์ในการแก้ไขไฟล์นี้และเปลี่ยนชื่อใหม่ แทนของพฤติกรรมนี้ผมอยากที่จะมีการบีบอัดไฟล์ใหม่นี้ในนอกจากนี้file.txtการที่มีอยู่ ตอนนี้ฉันใช้คำสั่งต่อไปนี้เพื่อทำเช่นนั้น

gzip -c file.txt > file.txt.gz

มันใช้งานได้ แต่ฉันสงสัยว่าทำไมไม่มีวิธีแก้ปัญหาที่ง่ายกว่าในการทำงานทั่วไป? บางทีฉันอาจพลาดตัวเลือกที่ทำเช่นนั้น?


3
นี่เป็นเพราะ gzip บีบอัดไฟล์ที่กำหนดและสร้างไฟล์ใหม่ การบีบอัดหมายถึงการบีบไฟล์ต้นฉบับและแทนที่ด้วยไฟล์ใหม่ ตัวเลือก "-c" ของคุณกำลังบอก gzip ให้ชัดเจนเพื่อบันทึกด้วยชื่ออื่น นั่นเป็นเหตุผลว่าทำไมจึงใช้งานได้
SHW

@SHW ฉันไม่ได้รับความคิดเห็นของคุณ ... ?
Manuel Selva

@ ManuelSelva เมื่อไฟล์ต้นฉบับถูกบีบอัดไม่จำเป็นต้องใช้อีกต่อไปฉันเดาว่านั่นคือการออกแบบ
เดซี่

2
เหตุใด gzip / gunzip จึงทำเช่นนี้โดยปริยายเมื่อไม่มีเครื่องมือ unix อื่นที่ทำสิ่งนี้อยู่นอกเหนือฉัน
Mateen Ulhaq

คำตอบ:


247

สำหรับ GNU gzip1.6 หรือสูงกว่า FreeBSD และสัญญาซื้อขายล่วงหน้าหรือรุ่นล่าสุดของ NetBSD ดูคำตอบของ don_cristi

สำหรับทุกรุ่นคุณสามารถใช้การเปลี่ยนเส้นทางของเชลล์ได้ใน:

gzip < file > file.gz

เมื่อไม่ได้รับอาร์กิวเมนต์ใด ๆ ให้gzipอ่านอินพุตมาตรฐานบีบอัดและเขียนเวอร์ชันบีบอัดไปยังเอาต์พุตมาตรฐาน เป็นโบนัสเมื่อใช้การเปลี่ยนเส้นทางของเชลล์คุณไม่ต้องกังวลกับไฟล์ที่ถูกเรียก"--help"หรือ"-"(อันหลังนั้นยังคงเป็นปัญหาอยู่gzip -c --)

ประโยชน์อีกอย่างgzip -c file > file.gzคือถ้าfileไม่สามารถเปิดได้คำสั่งจะล้มเหลวโดยไม่สร้างว่างเปล่าfile.gz(หรือเขียนทับที่มีอยู่file.gz) และไม่ต้องรันgzipเลย

ความแตกต่างอย่างมีนัยสำคัญเมื่อเทียบกับgzip -kว่าเป็นที่จะมีความพยายามในการคัดลอกไม่มีfileของเมตาดาต้า (เจ้าของสิทธิ์เวลาแก้ไขชื่อของไฟล์บีบอัด) file.gzเพื่อ

นอกจากนี้หากfile.gzมีอยู่แล้วมันจะลบล้างอย่างเงียบ ๆ ยกเว้นว่าคุณได้เปิดใช้noclobberตัวเลือกในเชลล์ของคุณ ( set -o noclobberตัวอย่างเช่นใน POSIX เชลล์)


4
ตอนนี้ที่อยู่ที่เฉพาะเจาะจงของคำถามของ OP และตอบคำถามทั่วไป "วิธีบอก gzip ให้เก็บไฟล์ต้นฉบับ" -cมีประโยชน์มากและมีประโยชน์มากกว่า
codewaggle

8
โปรดทราบว่าจริง ๆ แล้วควรจะพิมพ์ <และ> ลงในคำสั่งและไม่ได้แสดงถึงตัวยึดตำแหน่งสำหรับชื่อไฟล์
Gaurav Gupta

อะไรคือ-kตัวเลือก? ไม่สามารถหาได้ในหน้าคนเช่นรุ่นนี้ที่นี่linux.die.net/man/1/gzip นอกจากนี้ดูเหมือนว่า gzip จะคัดลอกข้อมูลเมตาของไฟล์ตามค่าเริ่มต้น
flow2k

1
@ flow2k นั่นคือลิงก์ไปยังคำตอบของ don_cristi
Stéphane Chazelas

อ่าฉันเห็นมันใน macos ของฉัน แต่ก็แย่เกินไปที่มันไม่ได้อยู่ใน RHEL หรือ Ubuntu ขอบคุณ
flow2k

138

โปรดทราบว่าเมื่อเร็ว ๆ นี้ (มิถุนายน 2013) ได้รับการปล่อยตัว"ยอมรับ --keep (-k) ตัวเลือกเพื่อความมั่นคงด้วยเครื่องมือเช่น XZ, lzip และ bzip2. ด้วยตัวเลือกนี้ gzip ไม่ลบไฟล์ใส่ชื่อเมื่อบีบอัดหรือคลาย"gzip-1.6

ตัดตอนมาจากหน้าคน:

  -k --keep
         Keep (don't delete) input files during compression or decompression.

ดังนั้น1.6คุณสามารถใช้-kหรือ--keepเก็บไฟล์ดั้งเดิมได้:

gzip -k -- "$file"

(โปรดทราบว่ามันไม่ทำงานหาก$fileเป็น-(ซึ่งgzipแปลว่าstdinหมายถึงไฟล์จริงที่เรียกว่า-) ซึ่งในกรณีนี้คุณต้องเปลี่ยนเป็น./-)

ตัวเลือกที่ได้รับการเปิดตัวครั้งแรกในการดำเนินงานของ FreeBSDgzip (ใน FreeBSD 7.0 ในปี 2007) bzip2สำหรับความสอดคล้องกับ นั้นgzipขึ้นอยู่กับการเขียนgzipซ้ำของ GNU โดย NetBSD ตัวเลือกในที่สุดก็ทำให้มันกลับไปในปี 2010-k NetBSD


10
โธ่ RHEL6 มาพร้อมกับรหัส 1.3.12 ในฐานเท่านั้น ...
Nicholas Tolley Cottrell

ใช้งานได้กับ Mac / OS X :) (ซึ่งก็คือ BSD)
พอล

มี distros มาตรฐานจำนวนมากที่ไม่ได้ใช้> = 1.6 อีกต่อไปหรือไม่ สงสัยว่าถ้าคำตอบต้องการการ
อัปเดต

"-" คืออะไร ฉันคิดว่า gzip -k "file" ใช้งานได้ดี
notilas


30

จากเอกสารดูเหมือนว่าไม่มีตัวเลือกในการสร้างสำเนาของไฟล์

คุณสามารถกำหนดฟังก์ชั่นเปลือก

gzipkeep() {
    if [ -f "$1" ] ; then
        gzip -c -- "$1" > "$1.gz"
    fi
}

แล้ว

gzipkeep file.txt

2
โปรดทราบว่าถ้าไฟล์นั้นคุณจะต้องเรียกว่าเป็น- gzipkeep ./-
Stéphane Chazelas
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.