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
tar
, která to podporuje-M
parametr, který mi tar
navrhl, když jsem se pokusil tar -zxv -f a.tgz -f b.tgz
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.
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)
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
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 {} \;