Re: [OT] Línea de comandos
On Fri, Feb 27, 2009 at 10:23:31AM -0800, Rodrigo Gallardo wrote:
> On Fri, Feb 27, 2009 at 09:48:16AM -0800, Carmen Marcela Alegria C. wrote:
> > Esta bien interesante el tema, a mi me gusta mucho el poder de la linea de comando ;)
> >
>
> > 3) find . -type f -iname '*.htm*' -print0 | xargs -0 grep -il body
> > es bueno, pero es realmente necesario que se haga otro proceso
> > por el | para hacerle el grep? no seria mejor hacer:
> >
> > find . -type f -iname '*.htm*' -print0 -exec grep -il body {} \;
>
> Hacer
> find ... | xargs grep ...
> crea
> 1 proceso para el find
> 1 proceso para el xargs
> 1 proceso grep (a menos que hayan muchos cientos de archivos a revisar, en
> cuyo caso creará 1 grep para cada varios cientos)
>
> es decir, 3 en total.
>
> Por otro lado,
> find ... -exec grep ...
> crea
> 1 proceso para find
> 1 proceso grep *para cada archivo que encuentra*
>
> es decir, te ahorras 1 proceso por el xargs, y lo cambias por decenas
> o cientos de greps. La ventaja de -exec es que se puede usar cuando lo
> que quieres ejecutar requiere el nombre del archivo antes del final de
> la lista de argumentos. Ejemplo: Mover todos los .jpg creados hace más
> de cierto tiempo, todos a un mismo directorio final.
>
>
> $ find . -name '*jpg' -cmin +600 -exec mv \{} directorio_destino \;
>
> y no podemos usar xargs aquí, por que directorio_destino tiene que ir
> *después* del archivo a mover.
Si hay un punto en contra de xargs, es cuando la cantidad de elementos
resulta muy numerosa y toma muchísimo tiempo que se genere la lista, para
luego ser procesada por la orden que viene tras el pipe.
Si combinas find -exec con sh -c no estás limitado al orden de los
argumentos y obtienes más flexibilidad. Por ejemplo, volviendo al ejemplo
de body, supongamos que deseamos identificar los archivos que tienen body
en el contenido, luego crear una copia de respaldo y cambiar body por
corpse:
$ find . -type f -iname "*.htm*" -exec sh -c \
'grep -iq "body" $0 && mv $0 $0.bak && sed "s/body/corpse/gi" $0.bak > $0' {} \;
Saludos.
--
Pablo Jiménez
Reply to: