grep/find
Dan Lukes
dan at obluda.cz
Wed May 25 22:19:44 CEST 2005
> for i in *; do grep -e 'vzorka1.*vzorka2' $i >/dev/null && rm -f $i; done
> find * -exec grep -e 'vzorka1.*vzorka2' {} \; -exec rm -f {} \; >/dev/null
> grep -e 'vzorka1.*vzorka2' * | cut -f1 -d: | sort -u | xargs rm -f
Ja bych jen podotknul, ke vsem zde nabizenym resenim (nejen temhle
Honzovo), ze 'grep' umi vracet primo jen samotna jmena souboru ve
kterych byl nalezen vyhovujici patern - zpusobuje to option '-l'
Takze misto nejruznejsich (nejen) zde predvadenych konstruktu na
vytazeni jmena z vystupu grepu lze nahradit volanim grepu s timto optionem.
Dal bych poukazal na to, ze pro relativne dlouhy konstrukt '-exec rm -f
{} \;' existuje ve findu predpripravena direktiva '-delete'.
V neposledni rade - zadani rikalo, ze je treba nalezt radky, kde je
'vzorka1' a zaroven 'vzorka2', zadani vsak nezminovalo, ze musi byt
nutne v tomto poradi - takze samotny regularni vyraz 'vzorka1.*vzorka2'
je patrne nedostatecny, spravne by patrne bylo nutne uvest (extended RV)
'vzorka1.*vzorka2|vzorka2.*vzorka1'.
Poslednim problemem nekterych uvedenych kostruktu muze byt pocatecni
pocet souboru a pouziti '*' - pokud souboru bude velke mnozstvi, pak
pouziti '*' selze na 'Argument list too long'
Relativne prehlednym a pritom asi za vsech situaci funkcnim resenim by
tak mohlo byt, napriklad:
grep -RlE 'vzorka1.*vzorka2|vzorka2.*vzorka1' . | xargs rm -f
(spousteno z adresare se soubory, jinak je treba vhodne upravit '.') coz
je doupravene Honzovo reseni [3]
Tim nepopiram, ze neexistuji i jina plne funkcni reseni.
Snad to nekomu pomuze. Pokud by snad mel nekdo dojem, ze poucuju
zbytecne protoze tohle vsechno preci vsichni vedi, tak to berte treba
jako pracovni deformaci. Momentalne z podobnych znalosti rozdavam
zapocty, tak to proste sam nastudovane mit musim a ty potencialni
problemy cizich navrhovanych reseni tam proste vidim "samovolne" ... ;-)
Dan
More information about the Users-l
mailing list