Categorías: Tutoriales

10 buenos hábitos para manejar la consola (2/2)

Si el otro día os comentábamos los primeros 5 buenos hábitos para manejar la consola, hoy os traemos los siguientes 5 con lo que terminamos esta serie, que como es digo, es una traducción adaptada del original de la librería técnica de IBM.

6. Agrupa tus comandos en una lista

Muchas shells nos proporciona métodos para agrupar conjuntos de comandos juntos en una lista de forma que podamos pasar el total de la suma de sus salidas a través de pipelines o redirigir todos los flujos hacia el mismo lugar. Veamos dos formas de hacerlo.

Ejecutar una lista de comandos en una shell secundaria

Se usan paréntesis para encerrar una lista de comandos en un grupo simple. Haciéndolo de esta forma, los comandos se ejecutan en una nueva shell secundaria y te permite redirigir o si no, recoger la salida del conjunto, como en el siguiente ejemplo.

~ $ ( cd tmp/a/b/c/ || mkdir -p tmp/a/b/c && \
> VAR=$PWD; cd ~; tar xvf -C $VAR archivo.tar ) \
> | mailx admin -S "Archivo"

En este ejemplo, el contenido del archivo es extraído en el directorio tmp/a/b/c mientras que la salida de los comandos agrupados es enviada por correo al administrador.

Ejecuta una lista de comandos en la shell actual

Utiliza las llaves para marcar la lista de comandos que deben ejecutar en la shell actual. Estate seguro que incluyes espacios entre las llaves y los comandos (sino puedes tener problemas de interpretación). También, debes tener cuidado poniendo un punto y coma al final de la lista. Veamos un ejemplo para este caso:

~ $ { cp ${VAR}a . && chown -R guest.guest a && \
> tar cvf newarchive.tar a; } | mailx admin -S "Nuevo archivo"

7. Utiliza xargs además de find

Utiliza xargs como filtro para hacer un mejor uso de la salida de la orden find. De esta forma, podemos hacer algo con la salida de find. La estructura básica es la siguiente:

~ $ find criterio-búsqueda-archivos ruta | \
> xargs acción-a-realizar-con-salida

Podríamos usarlo por ejemplo para borrar todos los ficheros MP3 de un directorio en particular:

find /tmp -maxdepth 1 -name '*.mp3' -maxdepth 1 | xargs rm

Por ejemplo, los del directorio temporal sin mirar en subdirectorios (maxdepth es 1).

8. Aprende a conocer cuando grep debería hacer la cuenta

Aunque con el parámetro -c le indicamos a grep que nos devuelva la cantidad de ocurrencias, no siempre funciona de forma correcta porque devuelve una salida por cada fichero, que a su vez muestra en diferentes líneas.

Para ello usamos:

~ $ grep -o and ruta | wc -l
3402

Siendo 3402, para este ejemplo, el número de ocurrencias.

9. Compara algunos campos en la salida, no sólo las líneas al completo

Para búsquedas en las que queremos definir que sólo haga comparaciones para ciertos campos, deberemos utilizar awk en lugar de grep. Veamos un ejemplo muy claro: estamos buscando ficheros cuya última modificación fue en diciembre. Sin embargo, tenemos un fichero de nombre “December”, aunque la modificación no sea en diciembre sí aparecería en el resultado usando grep.

~/tmp $ ls -l /tmp/a/b/c | grep Dec
-rw-r--r--  7 joe joe  12043 Jan 27 20:36 December_Report.pdf
-rw-r--r--  1 root root  238 Dec 03 08:19 README
-rw-r--r--  3 joe joe   5096 Dec 14 14:26 archive.tar
~/tmp $

Sin embargo, ese no es el resultado que buscamos. Para conseguirlo utilizamos awk y le indicamos que queremos que nos busque en la columna sexta, la que aparecen los meses:

~/tmp $ ls -l | awk '$6 == "Dec"'
-rw-r--r--  3 joe joe   5096 Dec 14 14:26 archive.tar
-rw-r--r--  1 root root  238 Dec 03 08:19 README
~/tmp $

Como podéis apreciar la flexibilidad de awk es enorme.

10. No uses más cat cuando busques con grep

Un error muy común al usar grep es utilizarlo conjuntamente con cat para buscar el contenido de un sólo fichero. Esto no es necesario, porque grep toma el nombre de los ficheros directamente como argumentos. Es decir, no hace falta usar cat.

Los siguientes dos ejemplos hacen lo mismo, pero el segundo ahorra texto en el comando y tiempo de ejecución:

~ $ time cat tmp/a/longfile.txt | grep and
2811

real    0m0.015s
user    0m0.003s
sys     0m0.013s
~ $ time grep and tmp/a/longfile.txt
2811

real    0m0.010s
user    0m0.006s
sys     0m0.004s
~ $
F. Javier Carazo Gil

Cofundador de CODECTION, empresa especializada en WordPress, autor de un libro sobre WordPress (el primero en español) y multitud de artículos (en medios físicos y virtuales) sobre el tema. Participa en la comunidad WordPress de forma activa siendo parte del equipo organizador de la WordPress Meetup de Córdoba, dando charlas en diferentes WordCamp y siendo autor y coautor de multitud de plugins libres y premium para WordPress de gran éxito.

Ver comentarios

  • Para find le paso el parametro -exec siguiendo tu ejemplo lo haría así:

    find /tmp -maxdepth 1 -name '*.mp3' -maxdepth 1 -exec rm {} \;

    Con el punto y coma "escapado"

    Saludos.

  • @nordri: Creo que hay casos, por exceso de líneas devueltas por el find, que darían lugar a un error que xargs los soluciona. Lo que no te puedo decir es el número exacto que provoca el "desborde".

  • "¿Y si uno de los nombres de archivo contiene un salto de línea?"
    Vale, ya sé que es poco probable, pero podría pasar.
    Además, yo creo que es más conveniente usar sólo find que find|xargs, por el mismo motivo que es más conveniente usar grep que cat|grep.

    Otra cosa: find tiene la opción -delete, que es más cómoda que usar -exec rm '{}' ';'. De todas formas me suena que algunas versiones de find no la tienen, así que mejor mirar el manual, o ejecutar: find -help | grep -e -delete

  • No he encontrado información al respecto de que sea un problema usar -exec, en el manual hablan de problemas de seguridad.
    Yo tenía entendido que ejecuta por ocurrencia, no crea un listado y luego ejecuta el listado que si podría dar fallos de desbordamiento pero he hecho pruebas y falla con 1 millón de ficheros.
    A veces damos cosas por sentado y no nos paramos a pensar.
    Aprendida la lección ;)

    Saludos

Entradas recientes

DeepSeek

2 días hace

Contacto

2 semanas hace

Smart-tv mute

2 semanas hace

STEAM OS

3 semanas hace

2025

4 semanas hace

El podcast de Linux Hispano – #072 – El hardware libre debe consolidarse como el software libre

https://www.youtube.com/embed/z-xGk9c_eOw Guionista y locutor: Manuel Ignacio López Quintero.Fecha de publicación: 31 de diciembre de 2024.

1 mes hace