Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/28.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 如何在bash中获取文件的绝对目录?_Linux_Bash_Shell - Fatal编程技术网

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

Linux 如何在bash中获取文件的绝对目录?,linux,bash,shell,Linux,Bash,Shell,我编写了一个bash脚本,它将输入文件作为参数并读取它。 此文件包含指向所用其他文件的一些路径(相对于其位置) 我希望脚本转到包含输入文件的文件夹,以执行进一步的命令 因此,如何从输入文件中获取文件夹(以及仅获取文件夹?(在linux中)。要获取完整路径,请使用: readlink -f relative/path/to/file 要获取文件的目录,请执行以下操作: dirname relative/path/to/file 您还可以将这两者结合起来: dirname $(readlink

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

我希望脚本转到包含输入文件的文件夹,以执行进一步的命令


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

要获取完整路径,请使用:

readlink -f relative/path/to/file
要获取文件的目录,请执行以下操作:

dirname relative/path/to/file
您还可以将这两者结合起来:

dirname $(readlink -f relative/path/to/file)
如果
readlink-f
在您的系统上不可用,您可以使用此*:

请注意,如果您只需要移动到指定为相对路径的文件目录,则不需要知道绝对路径,相对路径是完全合法的,因此只需使用:

cd $(dirname relative/path/to/file)
如果希望返回(脚本运行时)原始路径,请在完成后使用
pushd
而不是
cd
,以及
popd



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

的文件的链接,我一直在linux上使用readlink-f works

所以

FULL_PATH=$(readlink-f文件名)
DIR=$(dirname$完整路径)
PWD=$(PWD)
cd$DIR
#
cd$PWD

看一看
realpath
,它在和上可用,但在OpenBSD 6.8上不可用。我用的是:

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

去做你听起来想做的事。

在GitHub尝试我们新的Bash库产品,我们已经免费提供给社区使用。它干净、简单,并且有很好的文档记录,所以很值得学习。你可以做:

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

它是bash4+,不需要任何依赖项,还提供get\u dirname、get\u filename、get\u stemname和validate\u path

上述答案的问题来自使用“/”like“/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部分(您可以将dir或file传递给该脚本):
    dirname“$1”
  • 然后我们
    cd“$(dirname“$1”);
    进入这个相对目录
  • pwd-P
    并获取绝对路径。
    -P
    选项将避免符号链接
  • 作为最后一步,我们
    echo
    it
  • 然后运行脚本:

    abs.sh your_file.txt
    

    您是提供输入文件的完整路径,还是只提供相对于当前工作目录的路径?dhm:input提供相对路径,我希望绝对路径减去文件名。请注意,不幸的是,
    readlink-f
    在OS X上不起作用。我不需要整个路径,我只需要文件夹。但这提供了足够的帮助:readlink-f relativeFileLocation | xargsdirname@EmilSit:您在本机上是对的。但是您可以
    brew安装coreutils
    来获得它。请不要建议使用
    ${1%/*}
    ${1##*/}
    作为
    dirname
    basename
    的替代品。如果您给它一个简单的文件名,则首先要使用它(
    dirname foo.bar
    正确地说是
    ),以斜杠结尾的目录的第二个换行符(
    basename/foo/bar/
    ,正确地说是
    bar
    )。@ChenLevy有些人为了更快可能倾向于使用它(我认为
    basename
    /
    dirname
    不是内置的),他们会看到它一开始工作,但在未来某个时候突然中断,似乎没有什么好的理由。我会避免将它作为一个选项来建议,或者否认它不是一个真正的防弹替代品。不要在Bash中使用大写变量名,它有一天会与现有的变量发生冲突…哦,今天是:你确定了吗现在变量
    PWD
    已经存在于Bash中,它的值实际上是当前目录?并使用更多的引号。realpath对我来说很奇怪,它解析相对方向的符号链接!在Mac OS上为我工作
    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
    
    }
    
        myfile="./somefile.txt"
        FOLDER="$(dirname $(readlink -f "${ARG}"))"
        echo ${FOLDER}
    
    absPath(){
        if [[ -d "$1" ]]; then
            cd "$1"
            echo "$(pwd -P)"
        else 
            cd "$(dirname "$1")"
            echo "$(pwd -P)/$(basename "$1")"
        fi
    }
    
    $cat abs.sh
    #!/bin/bash
    echo "$(cd "$(dirname "$1")"; pwd -P)"
    
    abs.sh your_file.txt