.Gz dosya uzantısı olmadan bir gzip dosyası nasıl oluşturulur?


14

Orijinal dosya adını koruyan bir gzip dosyası oluşturmak istiyorum. Örneğin, gzipping "example.txt", "example.txt.gz" yerine "example.txt" adlı bir gzip dosyası çıkarmalıdır. Bunu tek bir komutla zarif bir şekilde yapmak mümkün mü (daha sonra değil mv)?


4
Biraz merak ediyorum. Bunu neden istiyorsun? Kötü bir fikir gibi geliyor.
Bernhard

3
Evet. Bir bash betiğine 2 tam satır koyar ve "my-elegant-command" olarak adlandırırsınız. ;)
goldilocks 21:13

2
@Bernhard Bir web uygulaması için sürekli entegrasyon oluşturma sürecinin bir parçasıdır. Statik varlıkların (CSS, JS dosyaları) dosya adı değiştirilmeden sıkıştırılması gerekir. Tarayıcıya teslim edildiğinde, uzantının alakasız olması için bir "content-encoding: gzip" başlığı eklenir. Ancak dosya adı değiştirilirse, kaynak HTML dosyalarında arama ve değiştirme yapmam gerekir.
jamieb

Bu gerçekten sizin için bir konuysa, gzip yürütülebilir dosyasına $ * ileten bir bash işlevi tanımlayabilirsiniz ve ikinci satır mv'yi sizin için yapar.
Bratchley

4
@ web uygulaması sorun: herhangi bir iyi web sunucusu sizin için sıkıştırma yapabilir / yapacak ...
Bananguin

Yanıtlar:


12

Bu çalışmıyor:

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

Bu bir yarış şartıdır:

# 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

Sorun, > example.txt(veya dd of=example.txtbu konuda) diğer işlemin okuma şansı olmadan dosyayı öldürmesidir. Yani açık bir çözüm yok, bu yüzden bağlı kalmalısınız mv.

Hile yapmanın birkaç yolu vardır. Dosyayı açabilir, ardından bağlantısını kaldırabilirsiniz - dosya kapatılana kadar var olmaya devam eder - ve aynı adla yeni bir dosya oluşturabilir ve gzip edilmiş verileri buna yazabilirsiniz. Ancak bash bunu kullanmak için zorlamak için bariz bir yol bilmiyorum ve ben yapsam bile, cevabım hala olurdu:

Yapma bile.

Herhangi gzipbir nedenden dolayı başarısız olursa veya gzipleme yaparken boş alanınız tükeniyorsa (diğer işlemler yazıyorsa veya gzip sonucu girişten daha büyükse - rasgele veriler için gerçekleşir - vb.), Dosyanızı kaybettiniz. . Tebrikler!

Ayrı bir dosya oluşturun ve mvbaşarılı olun. Bu, bulabileceğiniz en basit, anlaşılması kolay ve en güvenilir yöntemdir.


1
gzip example.txt && mv example.txt.gz example.txt
Tamlık

2
Hayır OP okumak depquid - olduğunu zarafetsiz .
goldilocks

@goldilocks "Ayrı bir dosya oluşturun ve mvbaşarılı olun." daha zarif yapılabilir mi? Sadece frostschutz'un cevabının belirli bir örnekle arttırılmasını önermeye çalışıyordum. Eğer mvdaha zarif düşündüğümden daha kullanılabilir, bir örnek verin.
13'te depquid

Öneriniz basit, zarif, açık bir yaklaşımdır, ancak işe yarayıp yaramayacağı pek çok değişkene bağlıdır, örneğin zaten bir example.txt.gz varsa ne yaparsınız? Ayrıca çalışmak için hiçbir uzantısı ile, zaten bir şekilde gzip dosyaları gzipping önlemek gerekir. Bu tamamen yeni bir solucan tenekesi, ama bu gerçekten sorunun bir parçası değildi.
frostschutz

10

AWS S3'e bir CI dağıtımının parçası olarak aynı sorunu yaşadım.

Bu .gzsonek olmadan bir dizini (yerinde) özyinelemeli gzipping için yaptım :

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

Benim için yeterince temiz görünüyor. Ama evet mvorada bir yerlerde bir ihtiyacın var gibi görünüyor .

Eğer kullanıyorsanız grunt, bakabilirsiniz grunt-contrib-compress. gruntÖzellikle S3'e dağıtmak için kullanılan araçlardan bazıları gzip'i de sizin için halleder.


1
edilmelidir find . -type ...değil find.:) boşluk lütfen ekleyin
humdinger

2

-S İstediğiniz uzatma

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

dog.txt_2015_11 ile sonuçlanacaktır

sıkıştırmayı açtığınızda uzantıyı belirtmeniz gerekir.

gzip -d _2015_11 dog.txt_2015_11

Unix'te dosya türünüzü belirlemek için dosya komutunu kullanın, uzantılar yanıltıcı veya sık sık eksik.


1

Ben hiçbir uzantısı ile bir gzip dosyası oluşturmak gerçekten yapmak için doğru bir şey olduğunu sanmıyorum.

IM Web sunucunuzu .gz dosyasını okuyacak şekilde yapılandırmanız gerekir. Muhtemelen böyle bir kuralınız var:

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

".Gz" ifadesini eklemek için istenen dosya adını yeniden yazan bir kural eklemeniz yeterlidir (aslında, istemcinin Accept-Encoding başlığında gzip listelediğini doğrulamanız gerekir)


1

Bunun için s3_website'yi deneyebilirsiniz .

Hem scala hem de ruby ​​ile yazılmış olması ve JVM'ye ihtiyacı olması hoşuma gitmiyor. Ayrıca yaptığı varsayımı sevmiyorum (özellikle kovadan ekstra dosyaları sildiği gerçeği), ancak bu konuda iyiyseniz çalışmalıdır.

Bu sınırlamaları olmayan kendi başıma böyle bir araç yazmayı planlıyorum, bizi izlemeye devam edin.


0

Bu gerçekten yapmanız gereken bir şey değil, çünkü bu dosyayı diğer sistemlere veya insanlara aktarırken, bunlar için kafa karıştırıcı olabilir ve sıkıştırılmış bir dosya olarak bulunmayabilir.

Herhangi bir sonek kullanmak istemiyorsanız, GNU sizin için iyi değildir, gzip -S ""a gzip: invalid suffix ''.

Ancak, her zaman gzip -S " "(boşluk) gibi bir şey gönderebilirsiniz ve bu şekilde gösterilecektir:

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

Daha sonra, sıkıştırmasını açmak istiyorsanız, gunzip -c testfile\ (soneki belirtmeden) veya hatta -fbayrakla bir şey yapmanız gerekir .

İçtenlikle, bir mvkomut eklemenin &&, kodunuza bu kadar güçlük getirmeyeceğini düşünüyorum. Her neyse, @frostschutz'un dediği gibi, bunu yapmak gerçekten iyi bir fikir değil.


Bu, statik bir web sitesini barındırmak gibi sıkıştırılmış dosyaları sunmak için S3'ü kullanmak istiyorsanız gerekli olan bir şeydir. Şunu
Cristian Măgherușan-Stanciu
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.