find, grep, xargs...CHYBNE ZADANA ULOHA - takze este raz

Jan Stary hans at stare.cz
Thu Apr 10 17:50:49 CEST 2008


On Apr 10 15:46:27, Jan Stary wrote:
> > > 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).

Napriklad:

	FreeBSD 7.0-RELEASE #0: Tue Mar 18 20:11:10 CET 2008
	CPU: Intel Pentium III (398.27-MHz 686-class CPU)
	real memory  = 268369920 (255 MB)


# Soubory budu presouvat mezi /tmp/from a /tmp/to

$ mkdir /tmp/from
$ mkdir /tmp/to

# Vyrobim 10000 zajimavych souboru jmenem blabla*,
# z nichz kazdy je docela maly, a obsahuje XYZXYZ,
# navic hned na zacatku.

$ cd /tmp/from
$ jot -w %05d 10000 1 10000 | { while read i; do echo XYZXYZ > blabla$i; done; }

# Dale vyrobim 50000 nezajimavych souboru jmenem bleble*,
# z nichz kazdy je veliky 10k, a zadny neobsahuje XYZXYZ.

$ jot -w %05d 50000 1 50000 |  { while read i ; do dd if=/dev/urandom of=bleble$i bs=10k count=1 2> /dev/null ; done ; }

# Zkusim oba zpusoby kopirovani

$ time find /tmp/from -name blabla\* -type f | xargs grep -l XYZXYZ | cpio -pdu /tmp/to
137 blocks

real	0m22.663s
user	0m0.846s
sys	0m10.256s

$ time find . -type f | xargs grep -l XYZXYZ | cpio -pdu /tmp/to
137 blocks

real	1m28.883s
user	0m3.274s
sys	0m19.862s



V prvnim pripade se provadi 60000 testu na -name blabla*,
a pak se cte 10000 * 8 bytu (a pak se kopiruje).

Ve druhem pripade se sice neprovadi zadne testy na -name blabla*,
ale pak se cte 50000 * 10 kbytu, z toho naprosta vetsina zbytecne
(a pak se kopiruje).

A ted si predstav, ze ty nezajimave soubory nebudou velke 10k,
ale treba 10M.


> (Pri desitkach tisic souboru muzes ostatne usetrit i na tom 'cpio -v').

$ time find . -type f | xargs grep -l XYZXYZ | cpio -pduv /tmp/to
/tmp/to//./blabla00001
[...]
/tmp/to//./blabla10000
137 blocks

real	1m46.817s
user	0m3.336s
sys	0m22.279s



	h.




More information about the Users-l mailing list