GNU/Linux >> Znalost Linux >  >> Linux

Jak vytvořit komprimovaný tar, když je příliš mnoho názvů souborů na to, aby se shell rozbalil na jednom řádku?

Jako robustní řešení použijte find k oddělení názvů souborů znakem null a poté přímo do tar , který čte vstup oddělený nulou:

find . -maxdepth 1 -name '*.csv' -print0 |
tar -czf archive.tgz --null -T -

To nyní zvládne vše názvy souborů správně a není omezen ani počtem souborů.

Pomocí ls generování seznamu názvů souborů k analýze jiným programem je běžný antivzor, ​​kterému je třeba se vyhnout, kdykoli je to možné. find může generovat výstup oddělený nulou (-print0 ), kterou může většina nástrojů dále číst nebo analyzovat. Protože znak null je jediný znak, který se nemůže objevit v názvu souboru (a / , samozřejmě), budete s tím vždy v bezpečí.


Ne, nelze připojit ke komprimovanému souboru tar, aniž byste jej nejprve dekomprimovali.

Nicméně tar může přijmout svůj seznam souborů ke zpracování ze souboru, takže můžete jednoduše:

ls *.csv > temp.txt
tar -zcf ball.tgz -T temp.txt

@slhck poukazuje na to, že výše uvedené řešení nebude fungovat, pokud budou v názvech souborů mezery (a pravděpodobně další nepříjemné znaky). Tato verze uzavírá každý název souboru do dvojitých uvozovek:

ls *.csv | sed -e 's/^\(.*\)$/"\1"/' > temp.txt
tar -zcf ball.tgz -T temp.txt

(To se samozřejmě přeruší, pokud máte v názvech souborů dvojité uvozovky, v takovém případě dostanete, co si zasloužíte. :)


Linux
  1. Jak obejít limit Linux Too Many Arguments

  2. Jak vytisknout poslední řádek komprimovaného souboru gz na příkazovém řádku?

  3. Jak spustím druhý shell v režimu jednoho uživatele?

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

  2. Jak udělat sudo zapamatovat si heslo déle

  3. [Linux] :Jak vyloučit adresář při použití příkazu shellu „tar“.

  1. Existují konvence pojmenování proměnných ve skriptech Shell?

  2. Jak zobrazit řídicí znaky (^c, ^d, ^[, …) odlišně v shellu?

  3. Jak se připojit k dalšímu řádku, když řádek odpovídá regulárnímu výrazu pro celý dokument ve VI?