2011-07-10 26 views
36

如何將路徑名中的..轉換爲bash腳本中的絕對路徑名。也就是說,如果我有一條路徑/home/nohsib/dvc/../bop,我希望將其更改爲無點的路徑,在這種情況下,/home/nohsib/bop如何將路徑名中的「..」轉換爲bash腳本中的絕對名稱?

我該怎麼做?

+2

@Tony : 回覆。你的mod:''..''不是省略號。它只有兩個點...一個點代表當前目錄,兩個點代表父代。省略號表示不確定的範圍。 ''..''是非常具體的。 [省略(編程操作員)](http://en.wikipedia.org/wiki/Ellipsis_%28programming_operator%29) –

+0

@fred - 謝謝,不知道我在那裏想什麼。我只能說,編輯SO問題已經很晚了,爲時已晚。我睡覺了。 – Tony

+0

這可能屬於Unix堆棧交換站點... – jth41

回答

40

你在找什麼是readlink

absolute_path=$(readlink -m /home/nohsib/dvc/../bop) 

請注意:您需要使用GNU的readlink實現它提供了 「-m」 選項。例如BSD的readlink沒有。

+2

比cd更棒! pwd'解決方案。值得注意的是相關的C函數是'realpath(3)'。 –

+1

這不是100%可移植的,但應該適用於大多數Linux系統 – Daenyth

+8

這是不正確的答案。 SO不需要將符號鏈接解析爲實際路徑,但將相對路徑擴展爲絕對路徑,這是不同的事情。假設我有數據文件和符號鏈接到目錄中的腳本,如果要解析當使用符號鏈接的相對路徑時目錄的絕對路徑,以便我要訪問數據文件,readlink或實際路徑將失敗 –

29

嘗試:

ABSOLUTE_PATH=$(cd /home/nohsib/dvc/../bop; pwd) 
+3

我認爲這個答案應該在頂部。有用。它是跨平臺的,不同於在OS X上有問題的readlink解決方案。 – algal

+0

這隻適用於目錄路徑,而不適用於文件路徑。 –

+4

@Craig:'ABSOLUTE_PATH = $(cd $(dirname {dir或file}); pwd)' –

2

使用

echo Absolute path: $(cd $1; pwd) 
-1

試試這個(假設你的相對路徑存儲在變量$ rel_path):

echo "`cd $rel_path; pwd`" 
+2

您執行pwd,捕獲它的輸出,然後使用echo打印它?不,謝謝,只需運行pwd而沒有反引號並且沒有回聲(基本上它們相互抵消)。 –

1

只是一個額外的注意,如果您當前的路徑是一個符號鏈接下,你可以解決這個真實路徑:

pwd -P 

爲了解決您的具體問題,這將發出一個cd命令更改目錄沒有'..'的路徑在裏面。注意:您將在同一文件夾,只要使用正確的路徑:

cd `pwd -P` 
0

作爲替代GNU的的readlink和真實路徑,我所創造的功能,以及將在腳本中獨立的像PWD和東西外部命令的運行。

http://www.linuxquestions.org/questions/blog/konsolebox-210384/getting-absolute-paths-of-unix-directories-and-filenames-in-shell-scripts-3956/

其中之一是這一個。它會將絕對路徑保存爲$ __。我使用閱讀那裏是安全的路徑名擴展。一個shell下

function getabspath { 
    local -a T1 T2 
    local -i I=0 
    local IFS=/ A 

    case "$1" in 
    /*) 
     read -r -a T1 <<< "$1" 
     ;; 
    *) 
     read -r -a T1 <<< "/$PWD/$1" 
     ;; 
    esac 

    T2=() 

    for A in "${T1[@]}"; do 
     case "$A" in 
     ..) 
      [[ I -ne 0 ]] && unset T2\[--I\] 
      continue 
      ;; 
     .|'') 
      continue 
      ;; 
     esac 

     T2[I++]=$A 
    done 

    case "$1" in 
    */) 
     [[ I -ne 0 ]] && __="/${T2[*]}/" || __=/ 
     ;; 
    *) 
     [[ I -ne 0 ]] && __="/${T2[*]}" || __=/. 
     ;; 
    esac 
} 
0

一個很好的解決辦法是:

readlink -ev mypathname 

它打印出與解決點的全路徑名。使用

7

一個問題:

ABSOLUTE_PATH=$(cd ${possibleDirectory}; pwd)

是,如果$ {} possibleDirectory不存在,ABSOLUTE_PATH將被設置爲當前目錄。這可能不是你想要或期望的。

我想用這個版本可能是一般更可取:

ABSOLUTE_PATH=$(cd ${possibleDirectory} && pwd)

如果$ {possibleDirectory}不存在或無法訪問,由於缺少目錄的訪問權限,ABSOLUTE_PATH將包含空串。

這樣做的好處是您可以測試空字符串或根據具體情況自然地嘗試失敗。默認爲一個失敗的「CD」命令的情況下,當前目錄可能會導致非常意外,並可能導致災難性的後果(如RM -rf「$ ABSOLUTE_PATH」)

+0

這隻適用於目錄路徑,不適用於文件路徑。 –

3

如果你想這樣做,而不遵循任何符號鏈接,然後嘗試使用realpath與選項-s

$ realpath -s /home/nohsib/dvc/../bop 
/home/nohsib/bop 

注意與realpath,通常所有,但最後一個組件必須存在。因此,對於上述工作,下面都必須存在於文件系統:

/home 
/home/nohsib 
/home/nohsib/dvc 

但是你可以使用-m選項繞過的要求。

$ realpath -sm /home/nohsib/dvc/../bop 
/home/nohsib/bop 

(注realpath並不適用於所有的系統,尤其是老年人非Debian系統。對於那些在嵌入式Linux工作,遺憾的是Busybox的realpath不支持-s-m開關。)

相關問題