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
)?
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
)?
Câu trả lời:
Đ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.txt
cho 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 gzip
khô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à mv
thà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.
gzip example.txt && mv example.txt.gz example.txt
mv
thà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 mv
có thể được sử dụng thanh lịch hơn tôi nghĩ, xin vui lòng cho một ví dụ.
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ó .gz
hậ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, grunt
bạn có thể nhìn vào grunt-contrib-compress
. Một số grunt
công cụ dành riêng cho việc triển khai lên S3 cũng sẽ xử lý gzip cho bạn.
find . -type ...
không find.
thêm không gian xin vui lòng :)
-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.
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ó)
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.
Đâ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 -f
cờ.
Tôi thực sự nghĩ rằng việc thêm một mv
lệ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.