我寫了一個bash腳本,它將輸入文件作爲參數並讀取它。
該文件包含一些路徑(相對於其位置)到所使用的附加文件。如何在bash中獲取文件的絕對目錄?
我希望腳本轉到包含輸入文件的文件夾,以執行更多命令。
那麼,如何從輸入文件中獲取文件夾(以及文件夾)?(在Linux上。)
我寫了一個bash腳本,它將輸入文件作爲參數並讀取它。
該文件包含一些路徑(相對於其位置)到所使用的附加文件。如何在bash中獲取文件的絕對目錄?
我希望腳本轉到包含輸入文件的文件夾,以執行更多命令。
那麼,如何從輸入文件中獲取文件夾(以及文件夾)?(在Linux上。)
要獲得完整的路徑使用:
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
代替cd
和popd
當您完成。
我一直在使用的readlink在Linux上
-f工作這麼
FULL_PATH=$(readlink -f filename)
DIR=$(dirname $FULL_PATH)
PWD=$(pwd)
cd $DIR
#<do more work>
cd $PWD
不會在Bash中使用大寫變量名稱,它將會有一天與已經存在的變量衝突......哦,這一天是現在:你知道變量'PWD'已經存在於Bash中,它的值實際上是當前目錄嗎?並使用更多的報價。 –
非常感謝,我會牢記這一點。 –
看一看的手冊頁realpath
,我用的就是和類似:
CONTAININGDIR = $(realpath $ {FILEPATH%/ *})
做你想做的事。
realpath對我來說有點奇怪,它解決了相對目錄的符號鏈接 –
謝謝!在Mac OS上爲我工作 –
在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。
與上述答案的問題與文件輸入與「./」如「./my-file。TXT」
(許多)解決方法:
absPath(){
if [[ -d "$1" ]]; then
cd "$1"
echo "$(pwd -P)"
else
cd "$(dirname "$1")"
echo "$(pwd -P)/$(basename "$1")"
fi
}
這兩個文件和文件夾的工作
"$1"
dirname "$1"
cd "$(dirname "$1");
進入這個相對目錄pwd -P
並獲得絕對路徑。該-P
選項將避免符號鏈接echo
它然後運行腳本:
abs.sh your_file.txt
$cat abs.sh
#!/bin/bash
echo "$(cd "$(dirname "$1")"; pwd -P)"
幾點說明:
myfile="./somefile.txt"
FOLDER="$(dirname $(readlink -f "${ARG}"))"
echo ${FOLDER}
你給剛纔的相對路徑的完整路徑,輸入文件或當前工作目錄? – dmh
dhm:輸入給出相對路徑,我想要絕對路徑*減去*文件名。 – BobMcGee