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