如何在bash中获取文件的绝对目录?
我写了一个bash脚本,将input文件作为参数并读取它。
这个文件包含一些path(相对于它的位置)到使用的附加文件。
我希望脚本转到包含input文件的文件夹,以执行更多的命令。
那么, 如何从input文件中获取文件夹(以及文件夹)呢? (在Linux中)
要获得完整的path使用:
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##*/} ) }
请注意,如果您只需移动到指定为相对path的文件的目录,则不需要知道绝对path,相对path是完全合法的,因此只需使用:
cd $(dirname relative/path/to/file)
如果您希望返回(在脚本运行时)到原始path,请使用pushd
而不是cd
,并在完成时popd
。
看一下realpath
的手册页,我使用它和类似的东西:
CONTAININGDIR = $(realpath $ {FILEPATH%/ *})
做你想做的事情
这将适用于文件和文件夹:
absPath(){ if [[ -d "$1" ]]; then cd "$1" echo "$(pwd -P)" else cd "$(dirname "$1")" echo "$(pwd -P)/$(basename "$1")" fi }
在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 }
它是Bash 4+,不需要任何依赖,并且还提供了get_dirname,get_filename,get_stemname和validate_path。
我一直在使用readlink -f在linux上工作
所以
FULL_PATH=$(readlink -f filename) DIR=$(dirname $FULL_PATH) PWD=$(pwd) cd $DIR #<do more work> cd $PWD
与上述答案的问题与文件input“./”如“./my-file.txt”
解决办法(很多):
myfile="./somefile.txt" FOLDER="$(dirname $(readlink -f "${ARG}"))" echo ${FOLDER}
$cat abs.sh #!/bin/bash echo "$(cd "$(dirname "$1")"; pwd -P)"
一些解释:
- 这个脚本获取相对path作为参数
"$1"
- 然后我们得到该path的dirname部分(您可以将dir或文件传递给此脚本):
dirname "$1"
- 然后我们
cd "$(dirname "$1");
到这个相对的目录 -
pwd -P
并获得绝对path。-P
选项将避免符号链接 - 作为最后一步,我们
echo
它
然后运行你的脚本:
abs.sh your_file.txt