如何在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)" 

一些解释:

  1. 这个脚本获取相对path作为参数"$1"
  2. 然后我们得到该path的dirname部分(您可以将dir或文件传递给此脚本): dirname "$1"
  3. 然后我们cd "$(dirname "$1");到这个相对的目录
  4. pwd -P并获得绝对path。 -P选项将避免符号链接
  5. 作为最后一步,我们echo

然后运行你的脚本:

 abs.sh your_file.txt