stdin'den ayıklanırken katranın otomatik olarak sıkıştırma türünü algılamasına izin ver


16

GNU katranı kullanıyorum. Dosyaları sıkıştırırken / açarken sıkıştırma türünü otomatik olarak algılayabilir. Ama bir arşivi stdin'den açmam gerekiyor ve sıkıştırma türü bilinmiyor. Ben katran bana doğru düşündüren verebilir ki fark ettim:

tar: Archive is compressed. Use -z option

Ama tar'ın bu argümanı girmemi istemeden otomatik olarak sıkıştırma seçeneğini kullanmasını istiyorum . Bunu nasıl yapabilirim? Neden tar sadece sıkıştırma türünü bildiği için sıkıştırmıyor?

Teşekkür ederim!


Gelişmesi zor değildi, ama şimdiye kadar yapılmadı.
peterh - Monica'yı

3
Bunu yapamamasının nedeni, onu okuyana kadar tarhangi veri türüne sahip olduğunu bilmemesi stdinve sıkıştırılmış programı çağırmak için çok geç olmasıdır. Gzip, bzip2 ve diğerlerini destekler. Bu soruna geçici bir çözüm bulmak kolay değildir (verileri arabelleğe alması gerekir), bu yüzden size yeniden denemenizi söyler.
Kevin Panko

@KevinPanko Neden çok geç kaldı? Hayır, geç değil. Bir arabellekteki ilk 4K'yı okur, sıkıştırma türünü (varsa) test eder, sonra programı çağırır. Bu tamponlama, 10-20 satır ek C koduydu.
peterh - Monica'yı

2
O anda hangi verilere sahip olduğunu bildiği zaman, artık verileri sıkıştırmayı açma yardımcı programı aracılığıyla aktarmak için basit fork()/ exec()yöntem kullanamaz . Yardımcı program stdinborudan okuyacaktı ve ilk 4K artık eksik olacaktı. Verileri okuduktan sonra tekrar boruya koymanın bir yolu yoktur.
Kevin Panko

3
@KevinPanko: Ancak, temelde eşdeğerini yaparak iki işlemi çatallayarak yapılabilir cat buffer - | gunzip. (Alternatif olarak, ekstra işlem ihtiyacını önlemek için tıkanmayan G / Ç kullanılabilir.)
Ilmari Karonen

Yanıtlar:


10

Bu, duymak istediğiniz cevap değildir, ancak kılavuzuna göre GNU katran tarafından desteklenmez:

Arşivi okurken bir dekompresyon seçeneği belirtmeniz gereken tek durum, bir borudan veya rasgele erişimi desteklemeyen bir teyp sürücüsünden okumaktır. Ancak, bu durumda GNU tar hangi seçeneği kullanmanız gerektiğini gösterecektir. Örneğin:

$ cat archive.tar.gz | tar tf -
tar: Archive is compressed.  Use -z option
tar: Error is not recoverable: exiting now

Bu tür bir teşhis görürseniz, önerilen seçeneği GNU katranının çağrılmasına ekleyin:

$ cat archive.tar.gz | tar tzf -

- 8.1.1 Sıkıştırılmış Arşivlerin Oluşturulması ve Okunması


2
Bunun OSX üzerindeki tar komutunda çalıştığını, ancak GNU tar kullanan Linux'ta çalışmadığını unutmayın. Yani bu olabilir sabitlenebilir.
Sean Perry

8

Son olarak, katranın arşivi stdin'den tespit etmesine ve sıkıştırmasını açmasına izin vermememin nedeninin GNU katranı kullanmam olduğunu fark ettim. BSD tar sorunsuz bir şekilde bunu yapabilir. Şimdi betiğimde tar yerine bsdtar kullanmaya karar verdim.

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.