gzip: บีบอัดไฟล์บน Linux แตกไฟล์ gzip และวิธีใช้ gunzip กับ zcat
gzip คือคำสั่งบน Linux ที่บีบอัดไฟล์หนึ่งไฟล์ให้เป็นไฟล์ .gz ส่วนการแตกไฟล์ทำได้โดยเติม -d ให้คำสั่งเดิมหรือใช้ gunzip บนเซิร์ฟเวอร์ AlmaLinux 9 ล็อกการเข้าถึงขนาด 31,878 ไบต์ลดลงเหลือ 4,424 ไบต์หลังบีบอัด และเมื่อแตกไฟล์ ขนาดกับเวลาแก้ไขเดิมก็กลับมาเหมือนเดิม
ผลลัพธ์ด้านล่างได้จากการรันในโฟลเดอร์ทดสอบบนเซิร์ฟเวอร์ AlmaLinux 9.8 ด้วยบัญชี root และเวลาเป็น UTC ล็อกการเข้าถึง โน้ต และไฟล์ตั้งค่าเป็นไฟล์ตัวอย่างที่สร้างขึ้นเพื่อการทดสอบ ส่วนที่อยู่ IP ในล็อกก็เป็นค่าตัวอย่างสำหรับเอกสาร
1️⃣ วิธีใช้คำสั่ง gzip
ในโฟลเดอร์ทดสอบมีล็อกการเข้าถึงสองไฟล์ ไฟล์โน้ตสองไฟล์ โฟลเดอร์ config ที่มีไฟล์ตั้งค่า และโฟลเดอร์ restore ที่ว่างอยู่
ls -ltotal 88
-rw-r--r-- 1 root root 31878 Oct 28 23:50 access.log
-rw-r--r-- 1 root root 47748 Oct 27 23:59 access.log-20261027
drwxr-xr-x 2 root root 39 Oct 29 00:19 config
-rw-r--r-- 1 root root 45 Oct 28 14:30 memo.txt
-rw-r--r-- 1 root root 426 Oct 27 09:10 readme.txt
drwxr-xr-x 2 root root 6 Oct 29 00:19 restoreเมื่อเขียนชื่อไฟล์ต่อท้าย gzip ไฟล์นั้นจะกลายเป็นไฟล์บีบอัดที่มี .gz ต่อท้ายชื่อ คำสั่งด้านล่างบีบอัด access.log และไม่แสดงผลอะไรเมื่อทำงานเสร็จ
gzip access.logหลังบีบอัด เมื่อดูด้วย ls -l จะไม่มี access.log เหลือเพียง access.log.gz ล็อกที่เคยมีขนาด 31,878 ไบต์กลายเป็น 4,424 ไบต์ และเวลาแก้ไขยังเป็นเวลาของไฟล์ต้นฉบับ
ls -l access.log access.log.gzls: cannot access 'access.log': No such file or directory
-rw-r--r-- 1 root root 4424 Oct 28 23:50 access.log.gzเมื่อเติม -v จะแสดงอัตราที่ลดลงและชื่อไฟล์ใหม่ของแต่ละไฟล์ [81.5%] ในบรรทัดของ readme.txt คืออัตราที่ลดลงจากขนาดเดิม ส่วน [replaced with] หมายความว่าไฟล์ต้นฉบับถูกแทนที่ด้วยไฟล์ .gz แล้ว
gzip -v readme.txtreadme.txt: 81.5% -- replaced with readme.txt.gzหากต้องการเก็บไฟล์ต้นฉบับไว้ ให้เติม -k เมื่อบีบอัด memo.txt ด้วย -k จะเหลือทั้ง memo.txt และ memo.txt.gz อยู่คู่กัน
gzip -k memo.txtls -l memo.txt memo.txt.gz-rw-r--r-- 1 root root 45 Oct 28 14:30 memo.txt
-rw-r--r-- 1 root root 71 Oct 28 14:30 memo.txt.gzmemo.txt ขนาด 45 ไบต์กลับใหญ่ขึ้นเป็น 71 ไบต์หลังบีบอัด ตามคู่มือทางการ gzip จะบีบอัดแม้ผลลัพธ์จะใหญ่กว่าต้นฉบับ และบันทึกชื่อไฟล์กับเวลาของไฟล์ต้นฉบับไว้ในไฟล์บีบอัดด้วย
เมื่อระบุหลายไฟล์พร้อมกัน แต่ละไฟล์จะได้ไฟล์ .gz แยกกัน เมื่อบีบอัดไฟล์ตั้งค่าสองไฟล์ในโฟลเดอร์ config จะได้สองไฟล์คือ app.conf.gz และ site.conf.gz
gzip -v config/app.conf config/site.confconfig/app.conf: 78.7% -- replaced with config/app.conf.gz
config/site.conf: 87.7% -- replaced with config/site.conf.gzls -l config/total 8
-rw-r--r-- 1 root root 206 Oct 20 11:00 app.conf.gz
-rw-r--r-- 1 root root 93 Oct 20 11:05 site.conf.gz2️⃣ แตกไฟล์ gzip
เมื่อแตก access.log.gz ด้วย -d จะไม่มีผลลัพธ์แสดง access.log กลับมาอีกครั้ง และ access.log.gz จะไม่เหลืออยู่
gzip -d access.log.gzls -l access.log access.log.gzls: cannot access 'access.log.gz': No such file or directory
-rw-r--r-- 1 root root 31878 Oct 28 23:50 access.logaccess.log ที่กลับมามีขนาด 31,878 ไบต์ และเวลาแก้ไขก็ยังเป็น Oct 28 23:50 เหมือนก่อนบีบอัด
gunzip คือคำสั่งที่ทำงานเหมือน gzip -d หากเติม -k ด้วยจะแตกไฟล์โดยเก็บไฟล์บีบอัดไว้ และ [created] ในบรรทัดของ -v หมายความว่าสร้างไฟล์ใหม่โดยไม่ลบไฟล์ .gz
gunzip -kv readme.txt.gzreadme.txt.gz: 81.5% -- created readme.txtls -l readme.txt readme.txt.gz-rw-r--r-- 1 root root 426 Oct 27 09:10 readme.txt
-rw-r--r-- 1 root root 108 Oct 27 09:10 readme.txt.gzgzip ไม่มีตัวเลือกสำหรับกำหนดโฟลเดอร์ปลายทาง จึงต้องใช้ -c ส่งเนื้อหาที่แตกแล้วไปยังเอาต์พุตมาตรฐาน แล้วเขียนพาธของไฟล์ใหม่ไว้หลัง [>] คำสั่งด้านล่างแตก memo.txt.gz เป็น memo.txt ในโฟลเดอร์ restore
gzip -dc memo.txt.gz > restore/memo.txtls -l restore/total 4
-rw-r--r-- 1 root root 45 Oct 29 00:19 memo.txtเมื่อแตกด้วย -c ไฟล์ memo.txt.gz ยังอยู่เหมือนเดิม เวลาแก้ไขของ restore/memo.txt ที่สร้างใหม่คือ Oct 29 00:19 ซึ่งเป็นเวลาที่สร้างไฟล์
3️⃣ ตัวเลือกของคำสั่ง gzip
-l แสดงขนาดหลังบีบอัด ขนาดเดิม อัตราที่ลดลง และชื่อเมื่อแตกไฟล์ในบรรทัดเดียวโดยไม่ต้องแตกไฟล์ เมื่อบีบอัด access.log ใหม่ด้วย -k แล้วตรวจด้วย -l จะได้ผลดังนี้
gzip -k access.loggzip -l access.log.gz compressed uncompressed ratio uncompressed_name
4424 31878 86.2% access.logเมื่อเติม -v ด้วย จะมีวิธีบีบอัด (defla ย่อมาจาก deflate) ค่า CRC ของข้อมูลเดิม และวันที่กับเวลาของไฟล์ต้นฉบับเพิ่มเข้ามาด้านหน้า
gzip -lv access.log.gzmethod crc date time compressed uncompressed ratio uncompressed_name
defla b49b41c4 Oct 28 23:50 4424 31878 86.2% access.log-t ตรวจเพียงว่าไฟล์บีบอัดเสียหายหรือไม่แล้วจบการทำงาน หากใช้คู่กับ -v จะมี [OK] แสดงหลังไฟล์ที่ไม่มีปัญหา
gzip -tv access.log.gzaccess.log.gz: OKตัวเลข -1 ถึง -9 คือระดับการบีบอัด และตามคู่มือทางการค่าเริ่มต้นคือ -6 เราบีบอัด access.log ไฟล์เดียวกันด้วย -c สามครั้ง แล้วเทียบขนาดด้วย wc -c
gzip -c -1 access.log | wc -c5564gzip -c -6 access.log | wc -c4424gzip -c -9 access.log | wc -c4164| ระดับการบีบอัด | ขนาด .gz | เทียบกับขนาดเดิม |
|---|---|---|
| ไฟล์ต้นฉบับ (access.log) | 31,878 ไบต์ | 100% |
| -1 (เร็วที่สุด) | 5,564 ไบต์ | 17.5% |
| -6 (ค่าเริ่มต้น) | 4,424 ไบต์ | 13.9% |
| -9 (เล็กที่สุด) | 4,164 ไบต์ | 13.1% |
-9 เล็กกว่าค่าเริ่มต้น 260 ไบต์ ส่วน -1 ใหญ่กว่าค่าเริ่มต้น 1,140 ไบต์
หากใส่เพียงชื่อโฟลเดอร์ จะมี [is a directory -- ignored] และโฟลเดอร์นั้นจะถูกข้ามไป
gunzip configgzip: config is a directory -- ignoredหากต้องการจัดการไฟล์ทั้งหมดในโฟลเดอร์ ให้เติม -r เมื่อแตกโฟลเดอร์ config ที่บีบอัดไฟล์ตั้งค่าสองไฟล์ไว้ด้วย gunzip -r ทั้งสองไฟล์จะถูกแตกทีละไฟล์ตามลำดับ
gunzip -rv configconfig/app.conf.gz: 78.7% -- replaced with config/app.conf
config/site.conf.gz: 87.7% -- replaced with config/site.confls -l config/total 8
-rw-r--r-- 1 root root 840 Oct 20 11:00 app.conf
-rw-r--r-- 1 root root 528 Oct 20 11:05 site.conf-r บีบอัดหรือแตกไฟล์ในโฟลเดอร์แยกทีละไฟล์ และไม่รวมหลายไฟล์เป็นไฟล์เดียว หากต้องการรวมโฟลเดอร์เป็นไฟล์บีบอัดไฟล์เดียว ให้ใช้ คำสั่ง tarรวมและบีบอัดไปพร้อมกัน เมื่อบีบอัดโฟลเดอร์ config ด้วย tar -czf โฟลเดอร์และไฟล์ทั้งสองจะอยู่ใน config.tar.gz ไฟล์เดียว
tar -czf config.tar.gz configtar -tzvf config.tar.gzdrwxr-xr-x root/root 0 2026-10-29 00:19 config/
-rw-r--r-- root/root 840 2026-10-20 11:00 config/app.conf
-rw-r--r-- root/root 528 2026-10-20 11:05 config/site.conf📌 ตัวเลือกหลัก: ผลที่รันในบทความนี้
| ตัวเลือก | หน้าที่ | ผลที่เห็นในบทความนี้ | |
|---|---|---|---|
| -c | ส่งผลลัพธ์ไปยังเอาต์พุตมาตรฐานและคงไฟล์ต้นฉบับไว้ตามเดิม | ส่งเอาต์พุตของ -dc ไปที่ restore/memo.txt แล้วได้ memo.txt ขนาด 45 ไบต์ | |
| -d | แตกไฟล์ (เหมือน gunzip) | access.log.gz หายไป และ access.log ขนาด 31878 ไบต์กลับมา | |
| -k | เก็บไฟล์ต้นฉบับไว้หลังบีบอัดหรือแตกไฟล์ | memo.txt (45 ไบต์) และ memo.txt.gz (71 ไบต์) อยู่คู่กัน | |
| -v | แสดงอัตราที่ลดลงและชื่อไฟล์ใหม่ของแต่ละไฟล์ | readme.txt: 81.5% -- replaced with readme.txt.gz | |
| -l | แสดงรายการขนาด อัตรา และชื่อเมื่อแตกไฟล์ของไฟล์บีบอัด | ขนาดหลังบีบอัด 4424 ขนาดเดิม 31878 อัตรา 86.2% ชื่อ access.log | |
| -t | ตรวจว่าไฟล์บีบอัดเสียหายหรือไม่ | ใช้ -tv ได้ access.log.gz: OK ส่วน broken.gz ที่ท้ายไฟล์ขาดได้ unexpected end of file | |
| -r | บีบอัดหรือแตกไฟล์ทั้งหมดในโฟลเดอร์ | gunzip -rv config ครั้งเดียวแตกทั้ง config/app.conf.gz และ config/site.conf.gz | |
| -f | เขียนทับโดยไม่ถามแม้มีไฟล์ชื่อเดียวกัน | เขียนทับโดยไม่ถาม ไม่มี memo.txt เหลือเพียง memo.txt.gz (71 ไบต์) | |
| -1 ~ -9 | ระดับการบีบอัด (-1 เร็วที่สุด, -9 เล็กที่สุด, ค่าเริ่มต้น -6) | นับเอาต์พุตที่บีบอัดด้วย -1, -6, -9 ด้วย wc -c ได้ 5564, 4424, 4164 |
📎 ตัวเลือกอื่น: ตามคู่มือทางการ
| ตัวเลือก | หน้าที่ | |
|---|---|---|
| -N | ตอนบีบอัดจะบันทึกชื่อไฟล์และเวลาเดิมไว้ (ค่าเริ่มต้นตอนบีบอัด) และตอนแตกไฟล์จะคืนชื่อกับเวลาที่บันทึกไว้ | |
| -n | ตอนบีบอัดจะไม่บันทึกชื่อไฟล์และเวลาเดิม และตอนแตกไฟล์จะใช้ชื่อที่ตัด .gz ออก (ค่าเริ่มต้นตอนแตกไฟล์) | |
| -q | ไม่แสดงคำเตือนใด ๆ | |
| -S คำต่อท้าย | บีบอัดโดยเติมคำต่อท้ายที่กำหนดแทน .gz และตอนแตกไฟล์จะค้นหาคำต่อท้ายนั้นก่อน | |
| --rsyncable | บีบอัดให้ส่งเฉพาะส่วนที่เปลี่ยนเมื่อซิงก์ไฟล์บีบอัดกับเซิร์ฟเวอร์อื่นด้วย rsync |
🔲 ตัวจำลองคำสั่ง gzip
ในตัวจำลองด้านล่าง คุณพิมพ์คำสั่งเองเพื่อบีบอัดด้วย gzip แตกไฟล์ และดูเนื้อหาด้วย zcat และ zgrep ได้
4️⃣ ดูเนื้อหาไฟล์ gzip
ล็อกเก่าที่เก็บไว้พร้อมวันที่จะใช้พื้นที่น้อยลงเมื่อบีบอัดด้วย gzip คำสั่งด้านล่างบีบอัด access.log-20261027 ซึ่งเป็นล็อกของวันก่อนหน้า
gzip access.log-20261027ล็อกที่บีบอัดแล้วแสดงเนื้อหาบนหน้าจอด้วย zcat ได้โดยไม่ต้องแตกไฟล์ zcat เป็นคำสั่งเดียวกับ gunzip -c (ตามคู่มือทางการ) ไฟล์ .gz จึงยังอยู่เหมือนเดิม
zcat access.log-20261027.gz | head -3192.0.2.50 - - [27/Oct/2026:00:00:00 +0000] GET / HTTP/1.1 200 15929
192.0.2.54 - - [27/Oct/2026:00:00:07 +0000] GET / HTTP/1.1 200 17699
192.0.2.4 - - [27/Oct/2026:00:00:14 +0000] GET / HTTP/1.1 200 13813เอาต์พุตของ zcat ส่งต่อให้คำสั่งอื่นผ่านไปป์ได้ และเมื่อนับด้วย wc -l ล็อกนี้มี 600 บรรทัด
zcat access.log-20261027.gz | wc -l600หากต้องการค้นหาข้อความในล็อกที่บีบอัด ให้ใช้ zgrep เมื่อเติม -c จะแสดงเพียงจำนวนบรรทัดที่มี [ 404 ] หากต้องการดูเนื้อหาบรรทัดให้รันโดยไม่ใส่ -c
zgrep -c ' 404 ' access.log-20261027.gz37zgrep ' 404 ' access.log-20261027.gz | head -3192.0.2.23 - - [27/Oct/2026:00:02:06 +0000] GET /old-page-6/ HTTP/1.1 404 229
192.0.2.38 - - [27/Oct/2026:00:04:40 +0000] GET /old-page-2/ HTTP/1.1 404 217
192.0.2.22 - - [27/Oct/2026:00:07:42 +0000] GET /old-page-6/ HTTP/1.1 404 414เมื่อ zcat ได้รับไฟล์ที่ไม่ได้บีบอัด จะแสดง [not in gzip format] แล้วหยุด
zcat access.log | head -1
gzip: access.log: not in gzip formatzgrep อ่านไฟล์ที่ไม่ได้บีบอัดได้ตามปกติ จึงค้นหาในล็อกที่ใช้อยู่และล็อกเก่าที่บีบอัดไว้ได้ในครั้งเดียว หากระบุสองไฟล์ขึ้นไป จะมีชื่อไฟล์นำหน้าจำนวนบรรทัด
zgrep -c wp-login.php access.log access.log-20261027.gzaccess.log:36
access.log-20261027.gz:525️⃣ ข้อผิดพลาดของ gzip
หากบีบอัดไฟล์ที่ลงท้ายด้วย .gz อยู่แล้วซ้ำอีก จะมี [already has .gz suffix -- unchanged] และไฟล์จะคงเดิม
gzip access.log.gzgzip: access.log.gz already has .gz suffix -- unchangedในทางกลับกัน หากแตกไฟล์ที่ไม่ได้ลงท้ายด้วย .gz ด้วย -d จะมี [unknown suffix -- ignored]
gzip -d memo.txtgzip: memo.txt: unknown suffix -- ignoredไฟล์ที่มีแค่ชื่อเป็น .gz แต่ไม่ได้บีบอัดด้วย gzip จะจบด้วย [not in gzip format] ข้อความนี้ปรากฏเมื่อคัดลอกไฟล์ข้อความ memo.txt เป็นชื่อ notgzip.gz แล้วแตกไฟล์
cp memo.txt notgzip.gzgzip -d notgzip.gz
gzip: notgzip.gz: not in gzip formatไฟล์ .gz ที่ท้ายไฟล์ขาดหายเพราะดาวน์โหลดไม่สำเร็จจะจบด้วย [unexpected end of file] นี่คือผลการตรวจด้วย -t กับ broken.gz ที่เก็บไว้เพียง 2,000 ไบต์แรกของล็อกเก่าที่บีบอัด
head -c 2000 access.log-20261027.gz > broken.gzgzip -t broken.gz
gzip: broken.gz: unexpected end of fileแม้เป็นไฟล์ที่ขาดหาย หากแตกด้วย zcat ก็ดึงเนื้อหาออกมาได้จนถึงจุดที่ขาด จากล็อก 600 บรรทัด มี 162 บรรทัดเหลืออยู่ใน restore/broken.log และคู่มือทางการก็แนะนำให้กู้ส่วนต้นของไฟล์บีบอัดที่เสียหายด้วย zcat
zcat broken.gz > restore/broken.logwc -l restore/broken.log
gzip: broken.gz: unexpected end of file
162 restore/broken.logหากมีไฟล์ชื่อเดียวกับไฟล์ .gz ที่จะสร้างอยู่แล้ว gzip จะถามว่าจะเขียนทับหรือไม่ หากพิมพ์ n จะจบพร้อม [not overwritten] โดยไม่เปลี่ยนแปลงอะไร
gzip memo.txtgzip: memo.txt.gz already exists; do you wish to overwrite (y or n)? n
not overwrittenเมื่อเติม -f จะเขียนทับทันทีโดยไม่ถาม เพราะไม่ได้เติม -k ไฟล์ memo.txt จึงหายไปและเหลือเพียง memo.txt.gz
gzip -f memo.txtls -l memo.txt memo.txt.gzls: cannot access 'memo.txt': No such file or directory
-rw-r--r-- 1 root root 71 Oct 28 14:30 memo.txt.gzข้อความผิดพลาดที่พบระหว่างจัดการการบีบอัดและสิ่งที่ควรตรวจต่อมีดังนี้
| เอาต์พุต | ความหมาย | สิ่งที่ควรตรวจสอบต่อ |
|---|---|---|
| already has .gz suffix -- unchanged | ไฟล์ลงท้ายด้วย .gz อยู่แล้วจึงไม่บีบอัดซ้ำ | ได้ใส่ชื่อไฟล์ต้นฉบับที่จะบีบอัดหรือไม่ |
| unknown suffix -- ignored | พยายามแตกไฟล์ที่ไม่ได้ลงท้ายด้วย .gz | ชื่อไฟล์ .gz ด้วย ls |
| not in gzip format | ชื่อเป็น .gz แต่ไม่ใช่ไฟล์ที่บีบอัดด้วย gzip | รูปแบบจริง (zip, tar) และคำสั่งที่ตรงกัน |
| unexpected end of file | ท้ายไฟล์บีบอัดขาดหาย | เทียบขนาดกับต้นฉบับแล้วดาวน์โหลดใหม่ · กู้ส่วนต้นด้วย zcat |
| already exists; do you wish to overwrite | มีไฟล์ชื่อเดียวกับไฟล์ที่จะสร้างอยู่แล้ว | หากเขียนทับได้ใช้ y หรือ -f · หากจะเก็บไว้ใช้ -c กับชื่ออื่น |
| is a directory -- ignored | ใส่ชื่อโฟลเดอร์แทนชื่อไฟล์ | ไฟล์ในโฟลเดอร์ใช้ -r · หากจะรวมเป็นไฟล์เดียวใช้ tar |
🔢 FAQ & เนื้อหาแนะนำ
ค้นหา
คำสั่ง grep ของ Linux
คำสั่ง grep สำหรับค้นหาสตริงในไฟล์ข้อความอย่างล็อก มีตัวอย่างการใช้ร่วมกับ tail และ find ผ่านไปป์ด้วย
ดิสก์
คำสั่ง du: การตรวจพื้นที่ดิสก์ของไฟล์
คำสั่ง du สำหรับตรวจว่าไฟล์และไดเรกทอรีใช้พื้นที่ดิสก์ไปเท่าใด
การดูไฟล์
คำสั่ง head และคำสั่ง tail ของ Linux
คำสั่ง head และ tail สำหรับดูบรรทัดแรกและบรรทัดสุดท้ายของไฟล์ ใช้บ่อยเวลาตรวจล็อกการเข้าถึงของเซิร์ฟเวอร์
ℹ️ ประกาศเรื่องลิงก์แอฟฟิลิเอต
เนื้อหาของเว็บไซต์นี้มีลิงก์แอฟฟิลิเอต หากผู้เข้าชมซื้อสินค้าหรือบริการผ่านลิงก์เหล่านี้ เว็บไซต์นี้จะได้รับค่าคอมมิชชันจากผู้ขาย ในกระบวนการนี้ ราคาที่ผู้ซื้อจ่าย(ราคาจะลดลงเมื่อมีโปรโมชัน↓)จะไม่สูงขึ้นแต่อย่างใด ราคา ส่วนลด และข้อมูลสต็อกที่แสดงเป็นข้อมูล ณ เวลาที่เขียนและอาจต่างจากความเป็นจริง โปรดตรวจสอบกับผู้ขายอีกครั้งก่อนซื้อ การเลือกและการประเมินสินค้าเขียนตามเกณฑ์ของเราเอง และการได้รับค่าคอมมิชชันหรือไม่ไม่มีผลต่อลำดับการแนะนำหรือเนื้อหาการประเมิน