如何在bash中获取文件的绝对目录?

时间:2013-07-10 17:27:18

标签: linux bash shell

我编写了一个bash脚本,它将输入文件作为参数并读取它 此文件包含一些路径(相对于其位置)与使用的其他文件。

我希望脚本转到包含输入文件的文件夹,以执行更多命令。

那么,如何从输入文件中获取文件夹(以及文件夹)?(在linux中。)

7 个答案:

答案 0 :(得分:131)

要获得完整路径使用:

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


* 虽然上述myreadlink在此问题的上下文中已经足够好,但相对于上面建议的readlink工具,它有一些限制。例如,它没有正确地跟随指向具有不同basename的文件的链接。

答案 1 :(得分:18)

看看realpath的手册页,我使用了类似的东西:

  

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

做你听起来像是想做的事。

答案 2 :(得分:6)

这适用于文件和文件夹:

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

答案 3 :(得分:3)

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

一些解释:

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

    abs.sh your_file.txt
    

答案 4 :(得分: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

}

它是Bash 4+,不需要任何依赖项,还提供get_dirname,get_filename,get_stemname和validate_path。

答案 5 :(得分:0)

上述答案出现问题,文件输入为&#34; ./"喜欢&#34; ./ my-file.txt&#34;

解决方法(很多):

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

答案 6 :(得分:-1)

我一直在使用readlink -f在linux上运行

所以

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

PWD=$(pwd)

cd $DIR

#<do more work>

cd $PWD