Extraer ruta, nombre y extensión de un fichero
Cuando estamos programando un script, muchas veces nos vamos a encontrar que necesitamos saber información de ficheros. Unas veces necesitaremos saber los permisos del fichero, pero otras veces necesitaremos conocer la ruta en la que se encuentra el fichero o separar el nombre del fichero de la extensión. Para ello vamos a trabajar con dos comandos y dos operaciones sobre cadenas de texto:
- dirname: devuelve la ruta del fichero, sin el nombre.
- basename: devuelve el nombre del fichero, sin la ruta.
- ${fichero%%.*}: devuelve el nombre del fichero, sin la extensión.
- ${fichero##*.}: devuelve la extensión del fichero.
Veamos cómo trabajar con estos comandos en un script:
#!/bin/bash ruta=$(dirname $1) fichero=$(basename $1) nombre=${fichero%%.*} extension=${fichero##*.} echo "Ruta: $ruta" echo "Fichero: $fichero" echo "Nombre del fichero: $nombre" echo "Extensión del fichero: $extension"
Para comprobar su funcionamiento, voy a crear un fichero con una extensión en mi directorio home con touch ~/fichero.txt
y se lo voy a pasar a este script:
$ touch ~/fichero.txt $ ./nombrefichero.sh ~/fichero.txt Ruta: /home/fernando Fichero: fichero.txt Nombre del fichero: fichero Extensión del fichero: txt
Como vemos, ${fichero%%.*}
nos devuelve el nombre de fichero sin punto y ${fichero##.*}
devuelve la extensión, también sin punto, por lo que si queremos construir un nuevo nombre de fichero que contenga una extensión a partir de uno o los dos datos, tendremos que añadir el punto.
Para verlo, vamos a cambiar el formato de todas las imágenes de un directorio de jpg a png y lo guardaremos en un directorio que se llame también png:
#!/bin/bash newext="png" [ -d $newext ] || mkdir $newext for filename in $(ls) do if [ ${filename##*.} == "jpg" ] then convert $filename "$newext/${filename%%.*}.$newext" fi done