Jeffrey Cross
Jeffrey Cross

Řešení velkého počtu souborů v Unixu

Většinu času můžete přesunout spoustu souborů z jedné složky do druhé spuštěním jednoduchého příkazu mv jako “mv sourcedir / * destdir /„. Problém je, že když se tato hvězdička rozbalí, každý soubor v adresáři se přidá jako parametr příkazového řádku k příkazu mv. Pokud sourcedir obsahuje mnoho souborů, může to přetečení vyrovnávací paměti příkazového řádku, což má za následek záhadnou chybu „Příliš mnoho argumentů“.

Nedávno jsem narazil na tento problém, když jsem se pokoušel spravovat adresář, ve kterém bylo více než milion souborů. Není to každý den, kdy narazíte na adresář, který obsahuje metrickou metodu souborů, ale když nastane problém, je to snadný způsob, jak se s ním vypořádat. Trik spočívá v použití šikovného programu xargs, který je navržen tak, aby vzal velký seznam jako stdin a oddělil jej jako argumenty pro jiný příkaz:

najít sourcedir -type f -print | xargs -l1 -i mv {} destdir /

-L1 řekne xargs, aby používali pouze jeden argument najednou, aby přešli do mv. Parametr -i říká xargs nahradit {} argumentem. Tento příkaz provede mv pro každý soubor v adresáři. V ideálním případě byste to optimalizovali a určili něco jako -l50, posílání souborů mv 50 najednou. To je, jak si vzpomínám, že xargs pracuje na jiných unixových systémech, ale GNU xargs, které mám na svém Linuxovém boxu, nutí počet argumentů na 1 kdykoliv, když je vyvolán -i. Ať tak či onak, dostane práci.

Bez parametru -i bude parametr -l fungovat v Linuxu, ale již nemůžete použít substituci {} a všechny parametry jsou umístěny jako konečné argumenty v příkazu. To je zbytečné, když chcete přidat konečný parametr, například cílový adresář příkazu mv. Na druhé straně je to užitečné pro příkazy, které skončí s vašimi parametry souboru, například když dáváte soubory s dávkovým odstraňováním s rm.

Kupodivu, v OS X jsou parametry pro xargs trochu nevyzpytatelné a kapitalizované. Dobrou zprávou je, že můžete vyvolat substituci parametru s více argumenty najednou. Chcete-li přesunout svazek souborů v OS X, najednou 50 souborů, zkuste následující:

najít sourcedir -type f -print | xargs -L50 -I {} mv {} destdir /

To je o tom všem. Toto je jen základní příklad, ale jakmile si zvyknete na používání xargs a najedete společně, je snadné nastavit parametry hledání a přesouvat soubory na základě jejich data, oprávnění nebo přípony souborů.

Podíl

Zanechat Komentář