Když píšete:
tar -xf *.gz
tar
příkaz vidí (například):
tar -xf abc.tar.gz def.tar.gz ghi.tar.gz
To je interpretováno jako požadavek na extrakci def.tar.gz
a ghi.tar.gz
z archivu abc.tar.gz
. Protože tam soubory nejsou, zobrazí se varovná zpráva.
Jinými slovy tar
funguje na jediném tar
soubor (případně komprimovaný) najednou (v jednom vyvolání). Nepracuje s více soubory tar.
Všimněte si, že pokud abc.tar.gz
obsahuje soubor pqr/xyz/important.c
, můžete extrahovat pouze jeden soubor zadáním:
tar -xf abc.tar.gz pqr/xyz/important.c
Zápis, který jste použili, je pouze variantou tohoto zápisu.
(A ano, mohou existovat důvody tar
tar
soubor. Gmail vám například neumožňuje odeslat soubor tar nebo soubor tar ve formátu gzip, který obsahuje spustitelný soubor. Pokud však vložíte gzipovaný soubor tar do nekomprimovaného souboru tar, nebude hledat spustitelný soubor uvnitř vnitřního souboru. Používám to, když potřebuji odeslat soubor tar se spustitelným souborem configure
skript.)
hlavním důvodem je tar
bere jeden argument názvu souboru. Když voláte tar *.tgz
bash rozšiřuje *
na všechny názvy souborů s formantem tgz a stane se tar file1 file2 file3
který tar
nepřijímá . Buď tedy použijete cyklus for jako for i in *.tgz; do tar -zxvf $i ;done
nebo použijte nějaký jiný příkaz, který provede tar
jako vedlejší efekt, jak je ukázáno v komentářích, je ls
nebo find . -maxdepth 1 -name \*tgz -exec tar -zxvf {} \;
(ls
výstup je vždy riskantní)
Když píšeš
tar -xzf *.gz
váš shell jej rozšíří na řetězec:
tar -xzf 1.gz 2.gz 3.gz
(za předpokladu, že 1.gz, 2.gz a 3.gz jsou ve vašem aktuálním adresáři).
tar
si myslí, že chcete extrahovat 2.gz
a 3.gz
od 1.gz
; nemůže tyto soubory najít v archivech a to způsobí chybovou zprávu.
Musíte použít smyčku for
příkazu xargs
extrahovat soubory.
ls *.gz |xargs -n1 tar -xzf
To znamená:spustit mi tar -xzf
za každých gz
-file v aktuálním adresáři.