2013-07-10 59 views
61

我寫了一個bash腳本,它將輸入文件作爲參數並讀取它。
該文件包含一些路徑(相對於其位置)到所使用的附加文件。如何在bash中獲取文件的絕對目錄?

我希望腳本轉到包含輸入文件的文件夾,以執行更多命令。

那麼,如何從輸入文件中獲取文件夾(以及文件夾)?(在Linux上。)

+0

你給剛纔的相對路徑的完整路徑,輸入文件或當前工作目錄? – dmh

+0

dhm:輸入給出相對路徑,我想要絕對路徑*減去*文件名。 – BobMcGee

回答

121

要獲得完整的路徑使用:

readlink -f relative/path/to/file 

獲取文件的目錄:

dirname relative/path/to/file 

您也可以將二者結合起來:

dirname $(readlink -f relative/path/to/file) 

如果你的系統上沒有readlink -f,你可以使用這個:

function myreadlink() { 
    (
    cd $(dirname $1)   # or cd ${1%/*} 
    echo $PWD/$(basename $1) # or echo $PWD/${1##*/} 
) 
} 

請注意,如果你只需要移動到指定爲相對路徑的文件的目錄,你不需要知道的絕對路徑,相對路徑是完全合法的,所以只需使用:

cd $(dirname relative/path/to/file) 
如果你想回去(腳本運行時)到原始路徑

,使用pushd代替cdpopd當您完成。

+10

不幸的是,'readlink -f'在OS X上不起作用。 –

+0

我不想整個路徑,我只是想要文件夾。但是這提供了足夠的幫助:readlink -f relativeFileLocation | xargs dirname – BobMcGee

+1

@EmilSit:你是對的 - 本地。但是你可以'brew install coreutils'來獲得它。 http://stackoverflow.com/a/4031502/1022967。 – mpettis

0

我一直在使用的readlink在Linux上

-f工作這麼

FULL_PATH=$(readlink -f filename) 
DIR=$(dirname $FULL_PATH) 

PWD=$(pwd) 

cd $DIR 

#<do more work> 

cd $PWD 
+3

不會在Bash中使用大寫變量名稱,它將會有一天與已經存在的變量衝突......哦,這一天是現在:你知道變量'PWD'已經存在於Bash中,它的值實際上是當前目錄嗎?並使用更多的報價。 –

+0

非常感謝,我會牢記這一點。 –

17

看一看的手冊頁realpath,我用的就是和類似:

CONTAININGDIR = $(realpath $ {FILEPATH%/ *})

做你想做的事。

+0

realpath對我來說有點奇怪,它解決了相對目錄的符號鏈接 –

+0

謝謝!在Mac OS上爲我工作 –

1

在GitHub上嘗試我們新的Bash庫產品realpath-lib,我們已向社區提供免費且無阻礙的使用。它很乾淨,簡單並且有很好的文檔記錄,所以很好學習。你可以這樣做:

get_realpath <absolute|relative|symlink|local file path> 

此功能是圖書館的核心:

if [[ -f "$1" ]] 
then 
    # file *must* exist 
    if cd "$(echo "${1%/*}")" &>/dev/null 
    then 
     # file *may* not be local 
     # exception is ./file.ext 
     # try 'cd .; cd -;' *works!* 
     local tmppwd="$PWD" 
     cd - &>/dev/null 
    else 
     # file *must* be local 
     local tmppwd="$PWD" 
    fi 
else 
    # file *cannot* exist 
    return 1 # failure 
fi 

# reassemble realpath 
echo "$tmppwd"/"${1##*/}" 
return 0 # success 

} 

這猛砸4+,不需要任何依賴關係,並且還提供get_dirname,get_filename,get_stemname和validate_path。

0

與上述答案的問題與文件輸入與「./」如「./my-file。TXT」

(許多)解決方法:

absPath(){ 
    if [[ -d "$1" ]]; then 
     cd "$1" 
     echo "$(pwd -P)" 
    else 
     cd "$(dirname "$1")" 
     echo "$(pwd -P)/$(basename "$1")" 
    fi 
} 
5

這兩個文件和文件夾的工作

  1. 這個腳本得到相對路徑作爲參數"$1"
  2. 然後我們得到目錄名是路徑的一部分(您可以目錄或文件傳遞給該腳本):dirname "$1"
  3. 然後我們cd "$(dirname "$1");進入這個相對目錄
  4. pwd -P並獲得絕對路徑。該-P選項將避免符號鏈接
  5. 作爲最後一步,我們echo

然後運行腳本:

abs.sh your_file.txt 
0
$cat abs.sh 
#!/bin/bash 
echo "$(cd "$(dirname "$1")"; pwd -P)" 

幾點說明:

myfile="./somefile.txt" 
    FOLDER="$(dirname $(readlink -f "${ARG}"))" 
    echo ${FOLDER} 
相關問題