GNU/Linux >> Znalost Linux >  >> Linux

Jak zkombinovat příkaz „tar“ s příkazem „najít“

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.


Linux
  1. Najděte soubory a adresáře v Linuxu pomocí příkazu find

  2. Jak najít proces s maximálním počtem deskriptorů souborů?

  3. Jak připojit výstup do souboru?

  1. Jak používat příkaz Tar v Linuxu

  2. Jak extrahovat soubor tar.gz v Linuxu pomocí příkazového řádku

  3. Jak auditovat oprávnění pomocí příkazu find

  1. Otevření souboru .tar.gz jediným příkazem

  2. příkaz tr - jak nahradit řetězec \n skutečným novým řádkem (\n)

  3. Jak najít výchozího správce souborů?