basename y dirname: dos comandos que deberías conocer
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