2013-06-05 7 views
14

kullanırken hata, ben Not found in archive hatası alıyorum. BenShell'in 'tar: arşiv bulunamadı' ı geçerli dizindeki tüm <code>.gz</code> dosyaları ayıklamak için <code>tar -xzf *.gz</code> kullandığınızda düzenli ifade

for file in `ls *.gz`; do tar -xzf $file; done 

Bu hatanın sebebi nedir gibi for-döngü tek tek ayıklamak veya kullanım Ancak, iyi çalışıyor?

+0

aslında bu argüman sözdizimi kaynaklanır katran komut satırında sadece bir katranı kabul eder ve geri kalanı başka bir şey olarak yorumlanır. Ayrıca xargs kullanabilirsiniz ('ls * .gz | xargs -n1 tar -xzf' veya benzeri). – ShinTakezou

+0

tar argüman olarak glob modelini kabul etmez (yani yorumlamaz) afaik – ShinTakezou

+0

@ShinTakezou: ancak kabuk '* .gz' gösterimini genişletir; 'tar' (genellikle) '' .gz' görmez. Bazen, dosya adında '*' ile ayıklamak istersiniz. Örneğin: tar -xf abc.tar.gz 'src/prog/* name. *' 'Src/prog/bigname.c',' src/prog/smallname.h' gibi dosyaları çıkartır; tek tırnaklar, kabuğun genişlemesini engeller * ve 'tar' gerçekten de genişletir. –

cevap

16

Eğer yazarken:

tar -xf *.gz 

tar komut (örneğin) görür: Bu arşivde abc.tar.gz den def.tar.gz ve ghi.tar.gz ayıklamak için bir istek olarak yorumlanır

tar -xf abc.tar.gz def.tar.gz ghi.tar.gz 

. Dosyalar orada olmadığından, uyarı mesajını alırsınız.

Başka bir deyişle, tar tek seferde (tek bir işlemde) tek bir tar dosyasında (muhtemelen sıkıştırılmış) çalışır. Birden fazla katranlı dosyalarda çalışmaz. abc.tar.gz bir dosya pqr/xyz/important.c içeriyorsa, belirterek sadece bir dosya ayıklayabileceğinden

Not: kullanılan

tar -xf abc.tar.gz pqr/xyz/important.c 

ifade, bu ifadenin sadece bir türüdür.

(Ve evet, tar bir tar dosya için nedenler olabilir. Eğer bir gömmek Örneğin, Gmail Ancak. Bir katran dosyası veya çalıştırılabilir bir dosya içeren gzip'li tar dosyasını gemi izin vermez sıkıştırılmamış bir tar dosyası içinde gzipped tar dosyası, çalıştırılabilir dosyayı bulmak için iç dosyanın içine bakmaz. Bunu, bir çalıştırılabilir dosya ile bir tar dosyası göndermeye ihtiyaç duyduğunda kullanırım.

18

Yazarken

tar -xzf *.gz 

sizin kabuk dizeye genişler:

(1.gz, 2.gz ve 3.gz geçerli dizininizdeyse).

tar Eğer 2.gz ve 1.gz den 3.gz ayıklamak istediğiniz düşünür; Bu dosyaları arşivlerde bulamıyor ve bu da hata mesajına neden oluyor.

Dosyalarınızı ayıklamak için xargs numaralı komutun for döngüsünü kullanmanız gerekir.

ls *.gz |xargs -n1 tar -xzf 

demektir Yani: geçerli dizinde her gz -File bana tar -xzf çalıştırın.

3

ana neden tar tek bir dosya adı argümanını alır. tar *.tgz arandığında, bash * tüm dosya adlarını tgz formant ile genişletir ve tarafından kabul edilmeyen tar file1 file2 file3 olur.Yani ya sen, bir for i in *.tgz; do tar -zxvf $i ;done gibi döngü için kullanmak veya yorumlarda gösterilen gibi bir yan etki olarak tar yürütür başka komutunu kullanın ls veya find . -maxdepth 1 -name \*tgz -exec tar -zxvf {} \; (ls çıkışı her zaman risklidir)

+0

Neden çıktı her zaman risklidir? –

+0

İsimler beyaz boşluk veya satır sonu içeriyorsa, 'ls’in çıktısı belirsizdir. Beyaz boşluk olmayan isimlerle (yeni satırlar dahil olmak üzere), bu iyi, ancak bu günlerde boşluk olmadan isimlere güvenemezsiniz. –

+0

@Jonathan Leffler, evet öyle! teşekkür ederim –