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. -- FreeBSD mailing list (users-l@freebsd.cz) http://www.freebsd.cz/listserv/listinfo/users-l