basename y dirname: dos comandos que deberías conocer

diciembre 18, 2020 , 0 Comments

terminal shell comandos Linux

A veces, algunos tutoriales van dirigidos a explicar comandos algo más exóticos y extraños, en cambio, existen algunos que incluyen las distribuciones de serie y no son tan populares como cd, ls, cat, etc., pero que son igualmente prácticos. En este tutorial te mostraré lo que se puede realizar con dos de esos comandos: basename y dirname.

Quizás a priori te parezcan absurdos y que no tienen ninguna utilidad, pero tienen aplicaciones bastante prácticas en algunos casos como, por ejemplo, en los scripts donde se necesita extraer alguna parte de una ruta, como el nombre del fichero o el directorio para que otro comando opere sobre esto…

Para qué sirven

Estos comandos son muy básicos, y sus funciones son:

  • basename: sirve para extraer el nombre del fichero de una ruta.
  • dirname: sirve para extraer el nombre del directorio de una ruta.

Ejemplos de uso

Aquí puedes ver algunos ejemplos de cómo usarlos:

  • Por ejemplo, para usar basename con /etc/passwd, y que te devuelva en su salida el nombre del fichero, en este caso passwd:

basename /etc/passwd

  • También puedes especificar una extensión para que te de el nombre del fichero sin la extensión. Por ejemplo, imagina que quieras extraer el nombre de una imagen /home/media/prueba.jpg sin la extensión jpg (devolvería prueba):

basename -s .jpg /home/media/prueba.jpg

  • Incluso puedes procesar varias rutas a la vez por separado, para ello tienes que usar la opción -a:

basename -a /etc/passwd /var/log/boot.log

  • Para hacer lo contrario, y que te de el nombre del directorio, sin el nombre del fichero, entonces tienes que usar dirname. Por ejemplo, si quieres usarlo en la ruta /var/spool/mail/prueba.txt y que te devuelva /var/spool/mail, entonces usa:

dirname /var/spool/mail/prueba.txt

En cuanto a una utilidad en un script, aquí tienes otro ejemplo. Imagina que tienes un script simple, y que en él hay una ruta que es variable. Pero quieres que muestre el directorio que contiene un fichero, independientemente del fichero, en ese caso podrías tener algo como:


pathname="/home/usuario/data/fichero"

result=$(dirname "$pathname")

echo $result

Evidentemente, en este script el «pathname» sería siempre ese mismo estático declarado por la constante del principio, pero pueden darse casos en los que no lo sea, y es ahí donde se vuelve práctico. Por ejemplo:


/*script para convertir una imagen gif en png*/

#!/bin/sh
for file in *.gif;do
    #Salir si no hay ficheros
    if [! -f $file];then
        exit
    fi
    b='basename $file .gif'
    echo NOW $b.gif is $b.png
    giftopnm $b.gif | pnmtopng >$b.png
done


Some say he’s half man half fish, others say he’s more of a seventy/thirty split. Either way he’s a fishy bastard.