Wyodrębnij wiele plików .tar.gz za pomocą jednego wywołania tar

35

Zastanawiałem się, czy (i oczywiście w jaki sposób) można powiedzieć, taraby wyodrębnić wiele plików za jednym razem.

Jestem doświadczonym użytkownikiem systemu Unix od kilku lat i oczywiście wiem, że możesz użyć forlub findcoś takiego, aby zadzwonić tarraz dla każdego archiwum, które chcesz wyodrębnić, ale nie mogłem znaleźć działającego wiersza polecenia, który spowodował tarwyodrębnić dwa pliki .tar.gz jednocześnie. (I nie, nie ma w tym nic złego for, ja tylko pytam, czy da się obejść.)

Być może zadaję to pytanie raczej z ciekawości

  • istnieje dziwny rozwidlenie targdzieś, który to obsługuje
  • ktoś wie, jak użyć -Mparametru, który tarzasugerował mi, kiedy próbowałemtar -zxv -f a.tgz -f b.tgz
  • wszyscy jesteśmy ślepi i to zupełnie łatwe do zrobienia - ale nie mogłem znaleźć żadnego śladu w sieci, które nie wykorzystują forlub findlub xargslub podobne.

Proszę nie odpowiadać za pomocą tar -zxvf *.tar.gz(ponieważ to nie działa) i odpowiadać tylko „nie działa”, jeśli jesteś absolutnie pewien (i być może masz też dobre wyjaśnienie dlaczego ).

Edycja: Wskazano mi odpowiedź na to pytanie na Stack Overflow, która mówi bardzo szczegółowo, że nie jest to możliwe bez zerwania z bieżącą tarskładnią, ale nie sądzę, żeby to była prawda. Używanie tar -zxv -f a.tgz -f b.tgzlub tar -zxv --all-args-are-archives *.tar.gzłamanie żadnej istniejącej składni, imho.

scy
źródło
Z ciekawości, jaka jest sytuacja, która spowodowała, że ​​zacząłeś myśleć o tym, jak uniknąć pętli?
unclejamil
1
FYI: GNU tar obsługuje archiwa tar z wieloma woluminami z tym -Mparametrem.
Steve-o
1
unclejamil: Piszę HowTo, a jednym z jego kroków jest rozpakowanie kilku skompresowanych plików (.tar.bz2, .tar.gz, .zip). A ponieważ jest to HowTo, zastanawiałem się, jaka byłaby najbardziej elegancka linia poleceń. :)
scy

Odpowiedzi:

39

Jest to możliwe, składnia jest dość łatwa:

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

Opcja -i ignoruje EOF na końcu archiwów tar ze strony man:

-i, --ignore-zeros
ignore blocks of zeros in archive (normally mean EOF)
wielomian
źródło
1
Wydawało mi się, że to działa. Dokładne komenda Kiedyś było: cat *.tar.bz2 | tar -ixjv. Dzięki!
scy
1
<For tgz> cat * .tgz | tar -xzvf - -i -C / destination / <or> dla pliku w * .tgz; do tar -xzvf $ plik -C / destination /; gotowe
Ferroao,
27

dla * .tar.gz

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

dla * .tar.bz2

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

dla * .tar.xz

for file in *.tar.xz; do tar -Jxf "$file"; done
Ratnesh
źródło
1
Napraw formatowanie tutaj, a będzie bardziej czytelne.
eyoung100
to jest świetne. format jest również świetny, ponieważ tak to wygląda w terminalu
smatthewenglish 10.04.15
1
Nie zapomnij umieścić cudzysłowów, $filejeśli twoje pliki mają nazwy ze spacjami.
Alexander Revo,
To tak naprawdę nie odpowiada na pytanie, czy można wyodrębnić wiele archiwów za pomocą pojedynczego wywołania tar. Ponadto użytkownik twierdzi, że zna już sposób korzystania z pętli for w celu iteracji zestawu plików.
Kusalananda
2

Musisz użyć pętli. To by nie złamałotar składni wiersza poleceń, aby umożliwić wiele -fopcji, ale wymagałoby to dodania kodu w celu przetworzenia kilku archiwów w sekwencji, z wszelkiego rodzaju warunkami brzegowymi (Co się stanie, jeśli archiwum w środku jest zniekształcone? Czy archiwa mogą używać różnych mechanizmy kompresji? Czy możesz mieć wiele -Copcji (opcja tar GNU, aby wyodrębnić do określonego katalogu)? Co powiesz na -K (opcja tar GNU, aby rozpocząć od określonej nazwy członka)?…).

Jedną z możliwości uniknięcia forpętli jest instalacja i aktywacja AVFS , systemu plików FUSE, który zapewnia przejrzysty dostęp do archiwów. Każde archiwum /path/to/archivepełni również funkcję katalogu ~/.avfs/path/to/archive#. Jeśli chcesz dopasować archiwa za pomocą symboli wieloznacznych, trudność polega na dodaniu tego #do dopasowania symboli wieloznacznych; można to zrobić w Zsh.

mountavfs
cp -p ~/.avfs$PWD/{a,b}.tgz\#/* /destination
cp -p ~/.avfs/path/to/source/*.tgz(e\''REPLY=$REPLY\#'\')/* /destination
Gilles „SO- przestań być zły”
źródło
-1

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

zjengjie
źródło
co to robi
Pierre.Vriens
1
Wprowadza to domyślną pętlę wywołującą tar raz dla każdego znalezionego pliku, a użytkownik mówi, że już wie, jak to zrobić.
Kusalananda
przepraszam, nie przeczytałem dokładnie pytania, ja tylko szukałem sposobu na wyodrębnienie wielu pakietów tar, przeczytałem powyższą odpowiedź i myślę, że użycie znalezienia będzie łatwiejsze.
zjengjie