Můžete použít něco jako:
find var/log -iname 'anaconda.*' -print0 | tar -cvf somefile.tar --null -T -
-print0 a -T společně povolte názvy souborů s mezerami, nové řádky atd. Konečný - řekne taru, aby načetl vstupní názvy souborů ze stdin.
Všimněte si, že -print0 musí přijít na konci vašeho prohlášení podle této odpovědi. Jinak pravděpodobně získáte více souborů, než očekáváte.
Poznámka: Poněkud efektivnější řešení naleznete v odpovědi @Iain.
Všimněte si, že find zavolá -exec akce pro každý jednotlivý soubor najde.
Pokud spustíte tar -cvf file.tar {} pro každý jednotlivý soubor find výstupy, to znamená, že přepíšete file.tar pokaždé, což vysvětluje, proč vám zůstane jeden archiv, který obsahuje pouze anaconda.storage.log — je to poslední soubor find výstupy.
Nyní skutečně chcete připojit soubory do archivu místo toho, abyste jej pokaždé vytvářeli (to je to, co -c možnost ano). Použijte tedy následující:
find var/log/ -iname "anaconda.*" -exec tar -rvf file.tar {} \;
-r volba se připojí k archivu místo toho, aby jej pokaždé znovu vytvořila.
Poznámka: Nahraďte -iname anaconda.* s -iname "anaconda.*" . Hvězdička je zástupný znak a váš shell může být rozšířen před find dokonce to vidí. Chcete-li tomuto rozšíření zabránit, zabalte argument do dvojitých uvozovek.
Pokud jde o tar odstranění úvodních / :Archiv by měl obsahovat pouze relativní názvy souborů. Pokud jste přidali soubory s úvodním / , budou uloženy jako absolutní názvy souborů, doslova znamená /var/… například na vašem počítači.
IIRC toto je pouze opatření pro tar implementace jiné než GNU a je to bezpečnější, protože nepřepíšete svá skutečná data v /var/… když archiv rozbalíte, pokud obsahuje relativní názvy souborů.
Zkuste toto:
tar -cvf file.tar `find var/log/ -iname "anaconda.*"`
Snažili jste se použít find na -exec tar . Ale způsob -exec volba funguje, spustí tento příkaz jednou pro každý odpovídající soubor, který najde, což způsobí tar přepsat soubor tar, který pokaždé vytvoří. Proto jsi skončil jen u posledního. Vzor, který zadáte do find, musíte také umístit do uvozovek aby jej shell nerozbalil, než jej předá find .
Použití substituce příkazů pomocí zpětných značek (nebo pomocí $(...) notace, chcete-li), celý seznam jmen vytvořených find se vloží zpět do příkazového řádku jako argumenty do tar , což způsobí, že je zapíše všechny najednou.