2012-06-28 277 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'選項。 –

相關問題