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