find, grep, xargs...CHYBNE ZADANA ULOHA - takze este raz
Jan Stary
hans at stare.cz
Thu Apr 10 15:46:27 CEST 2008
> > Najst medzi 10-kami tisic suborov subory, ktorych obsah (vnutri)
> > vyhovuje vzorke "XYZ" a tie nasledne prekopirovat (alebo presunut) do
> > ineho adresara. Spolocnym znakom vsetkych tych suborov je, ze cast nazvu
> > je rovnaka. Aby to bolo este zrozumitelnejsie, tak uvadzam zjednoduseny
> > tvar nazvov suborov:
> > "blabla000001", "blabla000002",..."blabla00000X",..."blablaXXXXXX"
>
> find /src -name blabla\* -type f | xargs grep -l XYZ | cpio -pduv /dst
> ...moze byt. Ja som to zapisal takto:
> find . -type f | xargs grep -l XYZ | cpio -pduv /dst
Pokud predem vis, jak se ty soubory (priblizne) jmenujou, je myslim
vhodne takto filtrovat uz ten prvni find: pokud je v /src krome nekolika
desitek tisic souboru, ktere obsahuji XYZ, zaroven nekolik desitek tisic
souboru, ktere _neobsahuji_ XYZ a _nejmenuji_ se blabla* (a nejake
takove tam jiste jsou, jinak bys udelal proste 'cp /src/* /dst'), pak
budes vsechny tyto "nezajimave" soubory zbytecne grepovat, tj. vsechny
je cele zbytecne prectes atd.
Ve tvoji verzi sice odpada tomu findu prace s testem na -name, nicmene
"zbytecne zkontrolovat jmeno" je porad o dost levnejsi nez "zbytecne
kontrolovat obsah" (a cim vice souboru, a cim vetsich, tim bude ten
rozdil markantnejsi).
(Pri desitkach tisic souboru muzes ostatne usetrit i na tom 'cpio -v').
> > Nicmene cpio(1) zachovava pri tomto kopirovani celou cestu,
> > neboli zachova celou adresarovou strukturu te mnoziny souboru;
> > tj. napriklad /src/path/some/where/blabla000123
> > prejde na /dst/path/some/where/blabla000123
> > nikoli na /dst/blabla000123
> ...a tym padom to skopiruje len subory, teda -> /dst/blabla000123
To ovsem pouze v pripade, ze uz ta zdrojova adresarova
struktura je placata, tj vsechno jsou to /src/blabla* (a tedy
z pohledu tveho "cd /src ; find . ..." jsou to ./blabla*) a nikoli
treba /src/some/where/blabla*.
h.
More information about the Users-l
mailing list