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.