it-swarm-eu.dev

Extrahujte více souborů .tar.gz jediným volaním dehtu

Přemýšlel jsem, zda (a samozřejmě jak) je možné říct, aby tar extrahoval více souborů najednou.

Jsem zkušený uživatel Unixu několik let a samozřejmě vím, že můžete použít for nebo find nebo podobné věci, abyste mohli volat tar jednou pro každý požadovaný archiv. extrahovat, ale nemohl jsem přijít s fungujícím příkazovým řádkem, který způsobil, že moje tar extrahovala dva soubory .tar.gz najednou. (A ne, s for není nic špatného, ​​pouze se ptám, zda je možné se obejít bez.)

Možná se ptám na tuto otázku spíše ze zvědavosti

  • existuje podivná vidlička tar, která to podporuje
  • někdo ví, jak používat -M parametr, který mi tar navrhl, když jsem se pokusil tar -zxv -f a.tgz -f b.tgz
  • jsme všichni slepí a je to celkem snadné - ale na webu jsem nenašel žádný náznak, který by nevyužíval for nebo find nebo xargs nebo jako.

Neodpovídejte prosím pomocí tar -zxvf *.tar.gz (protože to nefunguje ) a odpovězte pouze slovy „nefunguje“, pokud jste si tím naprosto jisti (a možná máte dobré vysvětlení proč).

Edit: Byl jsem poukázán na odpověď na tuto otázku na Stack Overflow , která velmi podrobně říká, že to není možné bez přerušení aktuální tar syntaxe, ale nemyslím si, že je to pravda. Použitím tar -zxv -f a.tgz -f b.tgz nebo tar -zxv --all-args-are-archives *.tar.gz by nezlomil žádnou existující syntaxi, imho.

39
scy

To je možné, syntaxe je celkem jednoduchá:

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

Možnost -i ignoruje EOF na konci archivu dehtu) ze stránky man:

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

Pro *. Tar.gz:

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

Pro *. Tar.bz2:

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

Pro *. Tar.xz:

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

Musíte použít smyčku. Neporušilo by to syntaxi příkazového řádku tar, která by umožňovala více -f možnosti, ale vyžadovalo by to přidání kódu pro zpracování několika archivů za sebou, se všemi druhy okrajových podmínek (Co se stane, pokud je archív uprostřed poškozen? Mohou archivy použít různé kompresní mechanismy? Můžete mít více -C options (možnost GNU tar extrahovat do konkrétního adresáře)? A co -K (možnost GNU tar začít u určitého člena)? …).

Jednou z možností, jak se vyhnout smyčce for, je nainstalovat a aktivovat AVFS , souborový systém Fuse , který poskytuje transparentní přístup k archiv. Každý archiv /path/to/archive zdvojnásobí se jako adresář ~/.avfs/path/to/archive#. Pokud chcete spojit archivy s zástupnými znaky, je tu překážka přidání toho, že # k zástupné shodě; to lze provést v zsh.

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

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

0
zjengjie