Tar.gz'den belirli dosyalar nasıl çıkarılır


105

Belirli dosyaları büyük bir tar.gz dosyasından nasıl ayıklayabiliriz? Bu soruda bir katrandan dosya çıkarma işlemini buldum , ancak burada belirtilen komutu denediğimde hatayı aldım:

$ tar --extract --file={test.tar.gz} {extract11}
tar: {test.tar.gz}: Cannot open: No such file or directory
tar: Error is not recoverable: exiting now

Daha sonra bir dosyayı nasıl çıkartırım tar.gz?


Herhangi bir çözümün önce arşivin tamamını açması gerektiğini unutmayın: superuser.com/questions/655739/… Bundan kaçınmak istiyorsanız, zip gibi başka bir biçim kullanmanız gerekir. Ancak, ZIP tek tek dosyayı ayrı ayrı sıkıştırdığı için daha az sıkıştırma verecektir: superuser.com/questions/1013309/… Hem dosyayı hem de hızı tek bir dosyayı çıkartma özelliğini destekleyen bir format olup olmadığını merak ediyorum.
Ciro Santilli

Yanıtlar:


119

Ayrıca kullanabilirsin tar -zxvf <tar filename> <file you want to extract>

Dosya adını tam olarak tar ztf test.tar.gzgösterildiği gibi yazmalısınız . Örneğin ./extract11, diyorsa , ya da some/bunch/of/dirs/extract11vermek zorunda olduğunuz şey budur (ve dosya tam olarak bu adla gösterilir, gerekli dizinler otomatik olarak oluşturulur).

  • -x: tar'ya dosyaları çıkartmasını söyler.
  • -f: dosya adını / tarball adını belirtir.
  • -v: Ayrıntılı (dosyalar ayıklanırken ilerleme göster).
  • -z: gzip ile arşiv arşivi, .gz dosyalarını açmak için kullanın.

$ tar -zxvf test.tar.gz extract11 tar: extract11: Not found in archive tar: Error exit delayed from previous errors
Ankit Vashistha

1
o zaman bunu deneyin. tar tf archive.tar.gz | grep extract11Lütfen ekstres11'in arşivde olup olmadığını kontrol edin
harish.venkat

8
Dosya adını tam olarak tar ztf test.tar.gzgösterildiği gibi yazmalısınız . Örneğin ./extract11, diyorsa , ya da some/bunch/of/dirs/extract11vermek zorunda olduğunuz şey budur (ve dosya tam olarak bu adla gösterilir, gerekli dizinler otomatik olarak oluşturulur).
von

Buraya bir nokta eklemek istiyorum, -zseçenek HP-UX gibi bazı unix sürümlerinde çalışmıyor.
Ankit Vashistha 26:15

1
@ pj-brunet: Hayır, fsonunda olmamalısınız. Ancak doğrudan dosya adı takip edilmelidir. Katran adından sonra tüm diğer seçenekleri ile Bu örnek çalışıyor: tar -f mytar.tar.gz -zxv dir/somefile. "Mytar.tar.gz" den "dir / somefile" komutunu çıkarır.
mivk

34

Diyelim ki adında bir tarball var lotsofdata.tar.gzve orada sadece istediğiniz bir dosya olduğunu biliyorsunuz, ancak hatırlayabileceğiniz tek şey, adının sözcüğü içerdiğidir contract. İki seçeneğiniz var:

Tarball'ınızın içeriğini listelemek için kullanın tarve grepkullanın, böylece bildiğiniz bölümle eşleşen dosyaların tam yolunu ve adını öğrenebilir ve daha sonra taro dosyanın tam ayrıntılarını bildiğiniz bir dosyayı çıkarmak için kullanabilirsiniz veya iki tane kullanabilirsiniz. Az bilinen anahtarlar, dosya adınız hakkında bildiklerinizle eşleşen tüm dosyaları ayıklamak için kullanılır - bu seçenek için tam adını veya yolunun herhangi bir bölümünü bilmenize gerek yoktur. Detaylar:

seçenek 1

$ tar -tzf lotsofdata.tar.gz | grep contract

Bu, isminizi bildiğiniz parçayı içeren tüm dosyaların detaylarını listeler. Sonra ne kullanmak istediğinizi ayıklayın:

$ tar -xzf lotsofdata.tar.gz <full path and filename from your list above>

./Çalışması için yolunuzun önüne ihtiyacınız olabilir .

seçenek 2

$ tar -xzf lotsofdata.tar.gz --wildcards --no-anchored '*contract*'

Size daha kolay veya en faydalı bulduğunuza kadar.


Drat. Son komuttaki bir yazım hatası: -xzf dosyasını kopyaladım. Bu anahtarların yalnızca bir örneği olmalıdır.
Wendy Cricks

tar -xzf lotsofdata.tar.gz <full path and filename from your list above>./tam yolun başında veren benim için çalıştı
user13107

Bunlara karşı sabırlı olmanız gerekebilir, biraz zaman aldı ... Belki de aşikardır, ancak bu dizinler henüz mevcut olmasa bile, geçerli dizin içindeki tam dizin yapısını çıkaracaktır.
PJ Brunet,

BSD tar (en azından macOS'ta) --wildcardsseçeneği desteklemiyor . Hala benzer davranışlar elde edebildim -x -O *foo. *fooDosyamın adı Glob'du çünkü dosyanın foo ile bittiğini biliyordum.
Eric Hu,

6

Geçen gün binlerce dosyayla tarball'dan birkaç yüz dosya çıkarmaya çalışıyordum. İhtiyacım olan dosyalara tek bir joker karakter tarafından başvuru yapılamaz. Bu yüzden googled ve bu sayfayı buldum.

Ancak, yukarıdaki numaraların hiçbiri görevim için iyi görünmüyor. Ben adamı okuma sona erdi ve bu seçeneği buldum --files-frombenim son çözümdür böylece,

gunzip < thousands.tar.gz | tar -x -v --files-from hundreds.list -f -

ve bir cazibe gibi çalışır.

Güncelleme: Liste dosyası, gördüğünüzle aynı biçime sahip olmalıdır tar -tvf, aksi takdirde herhangi bir dosyayı çıkaramazsınız.


2

Örneğin, diş tellerini atlarsanız, örneğin benim için çalışır.

$ tar --extract --file=test.tar.gz extract11

Extract11 dosyanız bir alt klasördeyse, tarball içindeki yolu belirtmelisiniz.

$ tar --extract --file=test.tar.gz subfolder/extract11

$ tar --extract --file=test.tar.gz extract11 tar: extract11: Not found in archive tar: Error exit delayed from previous errors
Ankit Vashistha

Öyleyse, dikkatli bir şekilde özü11, tar dosyasında değil. Göreceli yolu sağladığınızdan emin olun. Düzenlemeye bakınız
Bernhard

1

Aşağıda, tar.gz dosyasından belirli dosyaları çıkarma örneklerini bulabilirsiniz.

Yerel dosyadan:

$ tar xvf file.tgz path/README.txt 2nd_file.txt

Uzak URL’den:

$ curl -s http://example.com/file.tgz | tar xvf - path/README.txt 2nd_file.txt
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.