Estrai più file .tar.gz con una singola chiamata tar


35

Mi chiedevo se (e, ovviamente, come) è possibile dire tardi estrarre più file in una sola corsa.

Sono un utente Unix esperto da diversi anni e ovviamente so che puoi usare foro findcose del genere da chiamare taruna volta per ogni archivio che vuoi estrarre, ma non sono riuscito a trovare una riga di comando funzionante che abbia causato il mio tarper estrarre due file .tar.gz contemporaneamente. (E no, non c'è niente di sbagliato in for, sto solo chiedendo se è possibile farne a meno.)

Sto facendo questa domanda piuttosto per curiosità, forse

  • c'è una strana forchetta da tarqualche parte che supporta questo
  • qualcuno sa come usare il -Mparametro che tarmi ha suggerito quando ho provatotar -zxv -f a.tgz -f b.tgz
  • siamo tutti ciechi ed è totalmente facile da fare, ma non sono riuscito a trovare alcun suggerimento nel web che non sia stato utilizzato foro findo xargssimili.

Per favore non rispondere con tar -zxvf *.tar.gz(perché non funziona) e rispondi solo con "non funziona" se ne sei assolutamente sicuro (e forse hai anche una buona spiegazione del perché ).

Modifica: mi è stata indicata una risposta a questa domanda su Stack Overflow che dice in dettaglio che non è possibile senza interrompere la tarsintassi corrente , ma non credo sia vero. Utilizzando tar -zxv -f a.tgz -f b.tgzo non tar -zxv --all-args-are-archives *.tar.gzsi rompe alcuna sintassi esistente, imho.


Per curiosità, qual è la situazione che ti ha fatto iniziare a pensare a come evitare un costrutto a ciclo continuo?
unclejamil,

1
Cordiali saluti: GNU tar supporta gli archivi tar multi-volume con il -Mparametro.
Steve-o

1
unclejamil: sto scrivendo un HowTo e uno dei passaggi in esso comporta la decompressione di diversi file compressi (.tar.bz2, .tar.gz, .zip). E dal momento che è un HowTo, mi chiedevo quale sarebbe stata la riga di comando più elegante da fare. :)
scy

Risposte:


39

Questo è possibile, la sintassi è piuttosto semplice:

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

L'opzione -i ignora l'EOF alla fine degli archivi tar, dalla pagina man:

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

1
Questo sembra funzionare per me. Comando esatto che ho usato era: cat *.tar.bz2 | tar -ixjv. Grazie!
scy

1
<Per tgz> cat * .tgz | tar -xzvf - -i -C / destination / <or> per il file in * .tgz; esegui tar -xzvf $ file -C / destination /; fatto
Ferroao il

27

per * .tar.gz

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

per * .tar.bz2

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

per * .tar.xz

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

1
Correggi la formattazione qui e questo sarà più leggibile.
eyoung100

è fantastico il formato è ottimo anche perché è così che appare nel terminale
smatthewenglish

1
Non dimenticare di mettere le virgolette $filese i tuoi file hanno nomi con spazi.
Alexander Revo,

Questo in realtà non risponde alla domanda se è possibile estrarre più archivi usando una singola invocazione di tar. Inoltre, l'utente afferma di avere già familiarità con l'uso dei for-loop per scorrere su un set di file.
Kusalananda

2

Devi usare un loop. Non interromperebbe la tarsintassi della riga di comando per consentire più -fopzioni, ma richiederebbe l'aggiunta di codice per elaborare più archivi in ​​sequenza, con tutti i tipi di condizioni dei bordi (Cosa succede se un archivio nel mezzo è malformato? Gli archivi possono usare diversi meccanismi di compressione? Puoi avere più -Copzioni (opzione GNU tar per estrarre in una particolare directory)?

Una possibilità per evitare un forloop è installare e attivare AVFS , un file system FUSE che fornisce un accesso trasparente agli archivi. Ogni archivio /path/to/archivefunge anche da directory ~/.avfs/path/to/archive#. Se vuoi abbinare gli archivi con i caratteri jolly, c'è un ostacolo nell'aggiungerlo #a una partita jolly; può essere fatto in zsh.

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 {} \;


cosa fa questo?
Pierre.Vriens,

1
Questo introduce un ciclo implicito che chiama tar una volta per ogni file trovato e l'utente dice di sapere già come farlo.
Kusalananda

scusa non ho letto attentamente la domanda, stavo solo cercando il modo di estrarre più pacchetti di tar, leggere la risposta sopra e pensare che usare la ricerca sia più facile.
Zjengjie,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.