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

 

Deja una respuesta

Tu dirección de correo electrónico no será publicada.