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