[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

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: