2012-06-28 61 views
25

我想转换如何相对路径转换为绝对路径的Unix

相对路径 - /home/stevin/data/APP_SERVICE/../datafile.txt

绝对路径 - /home/stevin/data/datafile.txt

是否有一个内置的工具Unix如何做到这一点或任何好主意,我怎么能实现这一点。

史蒂夫

+0

也许你可以更新你的问题,以表明你为什么认为你需要这样做。这是一个功能!祝你好运。 – shellter

+0

我将相对路径标记为小文件,然后使用此条目将文件复制到其他位置。但是,APP_SERVICE文件夹有时可能不存在,导致使用此相对路径进行复制失败。 – qwarentine

回答

26

readlink -f /home/stevin/data/APP_SERVICE/../datafile.txt应该做你要找什么,假设你的Unix/Linux有readlink

+0

对不起,我没有readLink。我在Linux 2.6.18-194.el5上 – qwarentine

+2

什么配置? 'readlink'通常是'coreutils'软件包的一部分,通常默认安装。注意它全部是小写的,不是'readLink',而是'readlink' ... – twalberg

18

像这样的东西可以帮助目录(对于文件,与basename附加)

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

对于文件,

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

+1实际上'echo“$(cd $(dirname $ thingie); pwd)/ $(basename $ thingie)对于文件_and_目录,因为'dirname'和'basename'只是处理字符串,并不关心他们所使用的字符串是否是一个实际的FS对象 –

+0

@TobiasKienzler哦,是的,这实际上是一个错字,直到现在看到,一次同时拥有'../ dir1/dir2/file3'和'$ t'。我会解决这个问题。 :) – SuperSaiyan

+0

由于OP提到甚至没有'readlink',[这里](http://stackoverflow.com/a/20198034/321973)'一个甚至不需要'dirname'和'basename'的解决方案...... –

0

基于Thrustmaster's answer而是纯粹的庆典:

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

当然,cd需要通往通常情况下,这可能并非总是如此 - 在这种情况下,通过编写一个小型Python脚本,您可能会有更简单的生活...

11

我很惊讶没有人提到realpath呢。将您的路径传递给realpath,并将其规范化。

$ 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

系统上默认安装了'realpath'吗? –

+0

目前还不清楚“Unix中的内置工具”是什么意思(OP可能意味着内部shell命令)。即使“默认安装”也很模糊,因为操作系统安装程序通常允许用户选择要安装的组件。至于'realpath',它带有Debian/Ubuntu,并且只是一个apt-get/aptitude。但无论如何,OP还会问“任何好的想法”。 –

+0

在我的系统上,我需要添加'-f'选项。 –