Làm cách nào để tạo tệp gzip không có phần mở rộng tệp .gz?


14

Tôi muốn tạo một tệp được nén để giữ lại tên tệp gốc. Ví dụ: gzipping "example.txt" sẽ xuất ra một tệp được nén có tên "example.txt" thay vì "example.txt.gz." Có thể làm điều này một cách tao nhã với một lệnh (không thực hiện tiếp theo mv)?


4
Tôi hơi tò mò. Tại sao bạn muốn điều này? Nghe có vẻ là một ý tưởng tồi.
Bernhard

3
Vâng. Bạn đặt 2 dòng trong một tập lệnh bash và gọi nó là "lệnh my-Elegant". ;)
goldilocks

2
@Bernhard Đó là một phần của quá trình xây dựng tích hợp liên tục cho một ứng dụng web. Tài sản tĩnh (tệp CSS, tệp JS) cần được nén mà không thay đổi tên tệp. Khi được gửi tới trình duyệt, tiêu đề "mã hóa nội dung: gzip" được bao gồm để tiện ích mở rộng không liên quan. Nhưng nếu tên tệp bị thay đổi, tôi phải thực hiện tìm kiếm và thay thế trong các tệp HTML nguồn.
jamieb

Nếu đây thực sự là một vấn đề lớn đối với bạn, bạn có thể xác định hàm bash chuyển $ * cho tệp thực thi gzip và dòng thứ hai thực hiện mv cho bạn.
Bratchley

4
Sự cố ứng dụng web @your của bạn: bất kỳ máy chủ web tử tế nào cũng có thể / sẽ thực hiện việc nén cho bạn ...
Bananguin

Câu trả lời:


12

Điều này KHÔNG hoạt động:

# 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>

Đây là một điều kiện cuộc đua:

# 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

Vấn đề là > example.txt(hoặc dd of=example.txtcho vấn đề đó) giết chết tệp trước khi quá trình khác có cơ hội đọc nó. Vì vậy, không có giải pháp rõ ràng, đó là lý do tại sao bạn nên bám vào mv.

Có một số cách bạn có thể gian lận. Bạn có thể mở tệp, sau đó hủy liên kết tệp - tệp sẽ tiếp tục tồn tại cho đến khi bạn đóng tệp - và sau đó tạo một tệp mới có cùng tên và ghi dữ liệu được nén vào đó. Tuy nhiên tôi không biết một cách rõ ràng để ép buộc bash sử dụng điều đó và ngay cả khi tôi đã làm, câu trả lời của tôi vẫn là:

Đừng làm điều đó.

Nếu gzipkhông có lý do hoặc bất kỳ vấn đề nào xảy ra, như bạn hết dung lượng trong khi gzipping (vì các quy trình khác đang ghi hoặc kết quả gzip lớn hơn đầu vào - xảy ra đối với dữ liệu ngẫu nhiên - v.v.), bạn vừa mất tệp . Xin chúc mừng!

Tạo một tập tin riêng biệt và mvthành công. Đó là phương pháp đơn giản nhất, dễ hiểu và đáng tin cậy nhất mà bạn từng tìm thấy.


1
Làm thế nào về việc thêm vào để hoàn thiện:gzip example.txt && mv example.txt.gz example.txt
tước

2
Không có gì khó chịu khi đọc OP - đó là không phù hợp .
goldilocks

@goldilocks "Tạo một tệp riêng biệt và mvthành công." Có thể làm cho thanh lịch hơn? Tôi chỉ cố gắng đề xuất rằng câu trả lời của frostschutz được tăng cường bằng một ví dụ cụ thể. Nếu mvcó thể được sử dụng thanh lịch hơn tôi nghĩ, xin vui lòng cho một ví dụ.
tước

Đề xuất của bạn là cách tiếp cận đơn giản, thanh lịch, rõ ràng, nhưng liệu nó có hoạt động hay không phụ thuộc vào rất nhiều biến số, ví dụ: bạn sẽ làm gì nếu đã có example.txt.gz? Ngoài ra, không có phần mở rộng để làm việc, bạn phải ngăn chặn các tệp đã được nén bằng cách nào đó. Đó là một con giun hoàn toàn mới, nhưng đó không thực sự là một phần của câu hỏi.
frostschutz

10

Tôi đã có cùng một vấn đề, như là một phần của việc triển khai CI lên AWS S3.

Đây là những gì tôi đã làm cho đệ quy gzipping một thư mục (tại chỗ) mà không có .gzhậu tố:

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

Có vẻ đủ sạch cho tôi. Nhưng vâng, có vẻ như bạn cần một cái mvở đâu đó.

Nếu bạn đang sử dụng, gruntbạn có thể nhìn vào grunt-contrib-compress. Một số gruntcông cụ dành riêng cho việc triển khai lên S3 cũng sẽ xử lý gzip cho bạn.


1
Nên find . -type ...không find.thêm không gian xin vui lòng :)
ngôi sao đẹp nhất

2

-S tiện ích mở rộng bạn muốn

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

sẽ dẫn đến dog.txt_2015_11

Khi bạn giải nén nó, bạn phải chỉ định phần mở rộng.

gzip -d _2015_11 dog.txt_2015_11

Trong unix sử dụng lệnh tệp để xác định loại tệp bạn có, tiện ích mở rộng bị sai lệch hoặc thiếu thường xuyên.


1

Tôi không nghĩ việc tạo một tệp gzip không có phần mở rộng thực sự là điều nên làm.

IMHo bạn nên cấu hình máy chủ web của mình để đọc tệp .gz. Bạn có thể đã có một quy tắc như thế này:

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

Bạn chỉ cần thêm quy tắc viết lại tên tệp được yêu cầu để nối thêm ".gz" (thực ra, bạn nên kiểm tra xem tệp có tồn tại không, giống như bạn nên xác minh rằng máy khách đã liệt kê gzip trên tiêu đề Chấp nhận mã hóa của nó)


1

Bạn có thể thử s3_website cho việc này.

Tôi không thích thực tế nó được viết bằng cả scala và ruby ​​và nó cần JVM. Ngoài ra tôi không thích giả định mà nó đưa ra (đặc biệt là thực tế là nó xóa các tệp bổ sung khỏi nhóm) nhưng nó sẽ hoạt động nếu bạn ổn với điều đó.

Tôi dự định tự mình viết một công cụ như vậy mà không có những hạn chế này, hãy theo dõi.


0

Đây thực sự không phải là điều mà bạn nên làm, chủ yếu là vì khi chuyển tệp này sang các hệ thống hoặc người khác, cuối cùng có thể gây nhầm lẫn cho họ và không tìm thấy nó dưới dạng tệp nén.

Nếu bạn không muốn sử dụng bất kỳ hậu tố nào, thì GNU không tốt cho bạn, như gzip -S ""sẽ trả về a gzip: invalid suffix ''.

Tuy nhiên, bạn luôn có thể gửi một cái gì đó như gzip -S " "(khoảng trắng) và nó sẽ được hiển thị như thế này:

$ file testfile\  
testfile: gzip compressed data, was "testfile", from Unix, last modified: Tue Jun  3 XX:XX:XX 2014

Sau đó, nếu bạn muốn giải nén nó, bạn sẽ phải làm một cái gì đó như gunzip -c testfile\ (mà không chỉ định hậu tố), hoặc thậm chí với -fcờ.

Tôi thực sự nghĩ rằng việc thêm một mvlệnh với &&sẽ không gây ra nhiều rắc rối cho mã của bạn. Dù sao, và như @frostschutz đã nói, đó không phải là một ý tưởng thực sự tốt để làm điều này.


Đây là điều cần thiết nếu bạn muốn sử dụng S3 để phục vụ các tệp nén, như để lưu trữ một trang web tĩnh. Bạn có thể cân nhắc điều này: github.com/laurilehmijoki/s3_website
Cristian Măgherușan-Stanciu
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.