Tek bir tar çağrısı ile birden fazla .tar.gz dosyasını çıkarın


35

tarTek bir çalıştırmada birden fazla dosyayı çıkartmanın mümkün olup olmadığını (ve elbette nasıl) merak ediyordum .

Birkaç yıldır tecrübeli bir Unix kullanıcısıyım ve tabii ki çıkarmak istediğin her arşiv için bir kez aramak üzere kullanabileceğini forya findda ya da buna benzer şeyler kullanabileceğini biliyorum; aynı anda iki .tar.gz dosyasını çıkartmak için. (Ve hayır, yanlış bir şey yok, sadece onsuz yapmanın mümkün olup olmadığını soruyorum.)tartarfor

Bu soruya meraktan soruyorum, belki de

  • tarbunu destekleyen bir yerlerde garip bir çatal var
  • birisi denediğimde bana önerilen -Mparametrenin nasıl kullanılacağını biliyortartar -zxv -f a.tgz -f b.tgz
  • hepimiz körüz ve yapması çok kolay - ama internette kullanmayan forya findda xargsbenzeri bir ipucu bulamadım .

İle lütfen cevap verme tar -zxvf *.tar.gz(bunu yapmaz çünkü değil iş) ve sadece bu konuda kesinlikle eminseniz “iş değil” ile yanıt (ve belki iyi bir açıklama neden , çok).

Düzenleme: Ben işaret edildi Yığın taşması bu soruya bir cevap mevcut bozmadan mümkün olmadığını çok detaylı diyor tarsözdizimi, ama bunun doğru olduğunu sanmıyorum. Kullanmak tar -zxv -f a.tgz -f b.tgzveya tar -zxv --all-args-are-archives *.tar.gzvarolan sözdizimini bozmamak,


Meraktan, döngüsel bir kurgudan nasıl kaçınılacağı hakkında düşünmeye başlamanıza neden olan durum nedir?
amcamil

1
FYI: GNU tar , parametreli çok hacimli tar arşivlerini destekler -M.
Steve-o

1
unclejamil: Bir HowTo yazıyorum ve içindeki adımlardan biri sıkıştırılmış dosyaların paketini açmaktan ibarettir (.tar.bz2, .tar.gz, .zip). Ve bir HowTo olduğundan, bunu yapmak için en zarif komut satırının ne olacağını merak ediyordum. :)
scy

Yanıtlar:


38

Bu mümkün, sözdizimi oldukça kolaydır:

$ cat *.tar | tar -xvf - -i

-İ seçeneği, tar sayfasının sonundaki EOF'yi man sayfasından yok sayar:

-i, --ignore-zeros
ignore blocks of zeros in archive (normally mean EOF)

1
Bu benim için çalışıyor gibiydi. Kullandığım Tam komut oldu: cat *.tar.bz2 | tar -ixjv. Teşekkürler!
Scy

1
<Tgz için> cat * .tgz | * .tgz içindeki dosya için tar -xzvf - -i -C / destination / <or>; tar -xzvf $ file -C / destination /; bitmiş
Ferroao

27

* .tar.gz için

for file in *.tar.gz; do tar -zxf "$file"; done

* .tar.bz2 için

for file in *.tar.bz2; do tar -jxf "$file"; done

* .tar.xz için

for file in *.tar.xz; do tar -Jxf "$file"; done

1
Biçimlendirmeyi burada düzeltin; bu daha okunaklı olacaktır.
eyoung100

bu harika. biçim de harika çünkü terminalde nasıl göründüğü
smatthewenglish

1
$fileDosyalarınızda boşluk içeren adlar varsa, tırnak içine almayı unutmayın .
Alexander Revo

Bu, tek bir katran çağrısı kullanarak birden fazla arşiv çıkartmanın mümkün olup olmadığı sorusuna cevap vermiyor. Ayrıca, kullanıcı zaten bir dizi dosya üzerinde yineleme yapmak için döngüler için nasıl kullanıldıklarını bildiklerini söylüyor.
Kusalananda

2

Bir döngü kullanmanız gerekir. tarBirden fazla -fseçeneğe izin vermek için komut satırı sözdizimini bozmaz , ancak her türlü kenar koşuluyla çeşitli arşivleri sırayla işlemek için kod eklemeyi gerektirir (Ortadaki bir arşiv hatalı biçimlendirilirse ne olur? Sıkıştırma mekanizmaları? Birden fazla -Cseçeneğiniz olabilir mi (belirli bir dizine çıkarmak için GNU tar seçeneği)? Ne -K (belirli bir üye adından başlamak için GNU tar seçeneği)?…).

Bir fordöngüden kaçınmanın bir yolu , arşivlere şeffaf erişim sağlayan bir FUSE dosya sistemi olan AVFS'yi yüklemek ve etkinleştirmekdir . Her arşiv /path/to/archivebir dizin olarak ikiye katlanır ~/.avfs/path/to/archive#. Arşivleri joker karakterlerle eşleştirmek istiyorsanız, joker #karakter eşleşmesine eklemek için bir engel vardır ; zsh ile yapılabilir.

mountavfs
cp -p ~/.avfs$PWD/{a,b}.tgz\#/* /destination
cp -p ~/.avfs/path/to/source/*.tgz(e\''REPLY=$REPLY\#'\')/* /destination

-1

find . -name "*.tar.gz" -exec tar xzf {} \;


bu ne yapar?
Pierre.Vriens,

1
Bu, bulunan her dosya için bir kez tar çağrısı yapan gizli bir döngüyü tanıtır ve kullanıcı, bunun nasıl yapılacağını zaten bildiğini söyler.
Kusalananda

Üzgünüm soruyu dikkatlice okumadım, sadece çoklu katran paketi çıkartmanın yolunu araştırıyordum, yukarıdaki cevabı okudum ve bulmanın kullanımı daha kolay olacağını düşünüyorum.
zjengjie
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.