Absolute path with bash

El que alguna vez haya necesitado -como yo- extraer la ruta absoluta (absolute path) de un fichero o directorio quizá haya llegado a la misma solución que yo.

Para los que no, aquí está (y explicada).

Para obtener el ‘absolute path’ utilizaremos la sustitución con patrones y eliminación de bash. ${var%PATRON} eliminará la primera ocurrencia del patrón en la variable comenzando desde el final:

CARLOS02 /cygdrive/c/procesos
$ MY_VAR=abacab

CARLOS02 /cygdrive/c/procesos
$ echo ${MY_VAR%*ab}
abac

Lo que hace es buscar desde el final la primera ocurrencia del patrón ‘*ab’ desde el final y cuando la encuentra, la elimina. Si en vez de un ‘%’ ponemos dos ‘%%’, hará lo mismo, pero con la última ocurrencia:

CARLOS02 /cygdrive/c/procesos
$ echo ${MY_VAR%%*ab}

Aquí ha encontrado la última ocurrencia, y borra desde ahí (es decir: todo).

Con ello podemos hacer:

#!/bin/bash
#
if [ -d ${1} ]
 then
 echo "Absolute path: `cd ${1}; pwd`"
else
 echo "Absolute path: `cd ${1%/*}; pwd`"
fi
CARLOS02 /cygdrive/c/procesos
$ ls Notas*
Notas.txt

CARLOS02 /cygdrive/c/procesos
$ ./absolutepath.sh ./Notas.txt
Absolute path: /cygdrive/c/procesos

CARLOS02 /cygdrive/c/procesos

Otra cosa: el ‘cd${1}’ no cambia de directorio al shell principal (como se ve en la última línea escrita), ya que al estar entre ` `, queda restringido a esa llamada.

Saludos.

Carlos.

Anuncios

2 Responses to Absolute path with bash

  1. Óscar de la Torre dice:

    Hola Carlos,

    Cuando he visto tu post me ha traído viejos recuerdos y de hecho me sonaba que tenía algo parecido basado en dirname. No he sido capaz de encontrarlo pero una búsqueda en Google me ha refrescado la memoria. Se puede hacer empleando readlink.

    oskar@nadir ~
    $ ls
    test

    oskar@nadir ~
    $ pwd
    /home/oskar

    oskar@nadir ~
    $ dirname `readlink -e ./test`
    /home/oskar

    Saludos.

  2. carlosal dice:

    Óscar:

    Hay un par de problemas con readlink:

    1.- No es ‘universal’. En un SuSE 64:

    carlos@SuSE64VM:~> readlink -e /procesos
    readlink: invalid option — e
    Try `readlink –help’ for more information.

    2.- readlink ‘deshace’ los symlinks, y eso -a veces- no interesa.

    Si tenemos /procesos montado en / como symlink a /datos/procesos y hacemos :

    carlos@SuSE64VM:~> readlink /procesos
    /datos/procesos

    Mientras que la otra solución sí devuelve ‘/procesos’

    Saludos.

    Carlos.

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

A %d blogueros les gusta esto: