domingo, octubre 07, 2007

microtip: Usando xarg

En ocaciones se desea ejectuar algunos comandos, a los que se les pase como argumento el resultado de ejecutar comados previos. Ésto se logra usando el "entubamiento", es decir, se usan pipetas, tuberias, pipes o como prefieran llamarlo.

Significa redireccionar el flujo de salida de un comando, y conertirlo en la entrada de otro comando, lo cual se consigue usando el caracter "|" (barra vertical, pipe en inglés).

Por ejemplo, si se desea buscar todas las líneas que hay en un archivo que contengan una palabra en particular, basta con usar los comandos cat y grep para obtener el resultado deseado:

>$ cat archivo_interes.txt | grep palabra

En ocaciones lo que se necesita hacer, resulta repetitivo y no parece ser tan conveniente el uso del pipe, como en el caso de querer hacer directorios que tengan alguna forma particular, y que para facilidad los nombres estén contenidos dentro de un archivo.

Hasta aquí, parece que lo más conveniente es hacer un script y en un bucle, ir recorriendo el archivo linea por línea e ir ejectuando el comando con el argumento obtenido del archivo.

Sin embargo, existe un comando en *NIX que puede simplicar un poco el proceso, al permitir pasar el resultado de un comando, como entrada a otro comando, ejecutando vez a vez el resultado anterior, mediante el uso del pipe (|). Es decir, si el comando anterior devuelve como entrada un par de líneas, cada una de ellas será pasada como argumento al comando que esté posterior a xargs y se ejecutará 2 veces.

Por ejemplo, suponiendo que se desea crear una serie de subdirectorios, que se encuentran en un archivo, con xargs se puede hacer de la siguiete forma:

>$ cat /ruta/donde/esta/archivo.txt | xargs mkdir -p

Lo cual crea un directorio por cada línea obtenida del archivo mendiante cat.

Otro ejemplo, que se desea borrar todos los archivos que sean *.tmp y que no se sabe donde se encuentran. El comando find puede hacer la tarea de encontralos, y rm de eliminarlos, siendo algo parecido a:

>$ find / -name "*.tmp" -print | xargs rm

Sin embargo tener presente que si la tarea es más complicada, es conveniente evaluar si es mejor usar un script o no.

Para más detalles:

>$man xargs

En la wikipedia:

http://en.wikipedia.org/wiki/Xargs

0 Comentarios:

Publicar un comentario

Suscribirse a Comentarios de la entrada [Atom]

<< Página Principal