2012-06-28 20 views
25

Quiero convertirCómo convertir ruta relativa a la ruta absoluta en Unix

relativa Path - /home/stevin/data/APP_SERVICE/../datafile.txt

a

Absolute Path - /home/stevin/data/datafile.txt

¿Existe una herramienta integrada en Unix para hacer esto o cualquier buena idea sobre cómo puedo implementar esto.

-Steve

+0

Quizás pueda actualizar su pregunta para indicar por qué cree que necesita hacer esto. Esta es una característica! Buena suerte. – shellter

+0

Estoy estampando Relative Path en un archivo pequeño y usando esta entrada para copiar el archivo a una ubicación diferente más adelante. Sin embargo, la carpeta APP_SERVICE a veces puede no existir y hacer que falle la copia utilizando esta ruta relativa. – qwarentine

Respuesta

26

readlink -f /home/stevin/data/APP_SERVICE/../datafile.txt debe hacer lo que está buscando, asumiendo que su Unix/Linux tiene readlink.

+0

Lo siento, no tengo readLink. Estoy en Linux 2.6.18-194.el5 – qwarentine

+2

¿Qué distribución? 'readlink' es generalmente parte del paquete' coreutils', que generalmente se instala por defecto. Sin embargo, tenga en cuenta que todo está en minúscula, no 'readLink', sino' readlink' ... – twalberg

18

Algo como esto puede ayudar para los directorios: (para archivos, añadir con basename)

echo $(cd ../dir1/dir2/; pwd) 

Para los archivos,

filepath=../dir1/dir2/file3 
echo $(cd $(dirname $filepath); pwd)/$(basename $filepath) 
+0

+1 En realidad 'echo '$ (cd $ (dirname $ thingie); pwd)/$ (basename $ thingie)' 'hace el truco para ambos archivos _and_ directorios, ya que 'dirname' y' basename' simplemente procesan cadenas y no les importa si la cadena en la que trabajan es un objeto FS real –

+0

@TobiasKienzler Ohh, sí, eso fue en realidad un error tipográfico, que no hice Ver hasta ahora, tener ambos '../ dir1/dir2/file3' y' $ t' ambos a la vez. Voy a arreglar eso. :) – SuperSaiyan

+0

Como OP mencionó que ni siquiera tiene 'readlink', [aquí] (http://stackoverflow.com/a/20198034/321973) 'es una solución que ni siquiera requiere' dirname' y 'basename' ... –

0

Basado en Thrustmaster's answer pero con fiesta pura:

THING="/home/stevin/data/APP_SERVICE/../datafile.txt" 
echo "$(cd ${THING%/*}; pwd)/${THING##*/}" 

Por supuesto, el cd requiere la ruta a un existen normalmente, lo que puede no ser siempre el caso; en ese caso, probablemente tengas una vida más sencilla escribiendo un pequeño script en Python ...

11

Me sorprende que nadie mencione realpath todavía. Pase sus rutas al realpath y las canonicalizará.

$ ls 
Changes 
dist.ini 

$ ls | xargs realpath 
/home/steven/repos/perl-Alt-Module-Path-SHARYANTO/Changes 
/home/steven/repos/perl-Alt-Module-Path-SHARYANTO/dist.ini 
+0

¿Está 'realpath' instalado por defecto en su sistema? –

+0

No está claro qué significa "herramienta incorporada en Unix" (OP puede significar comando de shell interno). Incluso "instalado por defecto" es vago porque los instaladores de sistema operativo generalmente le permiten al usuario elegir qué componentes instalar. En cuanto a 'realpath', viene con Debian/Ubuntu y es solo un apt-get/aptitud de distancia. Pero de todos modos, OP también pregunta acerca de "cualquier buena idea". –

+0

En mi sistema, necesito agregar la opción '-f'. –

Cuestiones relacionadas