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

Bob*_*Gee 70 linux bash shell

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

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

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

Che*_*evy 137

要获得完整路径使用:

readlink -f relative/path/to/file
Run Code Online (Sandbox Code Playgroud)

要获取文件的目录:

dirname relative/path/to/file
Run Code Online (Sandbox Code Playgroud)

你也可以将两者结合起来:

dirname $(readlink -f relative/path/to/file)
Run Code Online (Sandbox Code Playgroud)

如果readlink -f您的系统上没有,您可以使用:

function myreadlink() {
  (
  cd "$(dirname $1)"         # or  cd "${1%/*}"
  echo "$PWD/$(basename $1)" # or  echo "$PWD/${1##*/}"
  )
}
Run Code Online (Sandbox Code Playgroud)

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

cd $(dirname relative/path/to/file)
Run Code Online (Sandbox Code Playgroud)

如果您希望返回(在脚本运行时)到原始路径,请使用pushd而不是cd,popd当您完成时.

  • 请注意,遗憾的是,`readlink -f`在OS X上不起作用. (15认同)
  • 请不要建议使用`$ {1%/*}`或`$ {1 ##*/}`代替`dirname`和`basename`.如果你给它一个简单的文件名(`dirname foo.bar`,正确地,是`.`),第一个中断,第二个打破以斜杠结尾的目录(`basename/foo/bar /`,will,正确地说,是'bar`). (3认同)
  • @EmilSit:你是对的——本质上。但你可以通过“brew install coreutils”来获取它。http://stackoverflow.com/a/4031502/1022967。 (2认同)

Ric*_*tze 18

看看手册页realpath,我用它和类似的东西:

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

做你听起来像你想做的事情.


Jah*_*hid 6

这适用于文件和文件夹:

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


Eug*_*kov 6

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

一些解释:

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

然后运行你的脚本:

abs.sh your_file.txt
Run Code Online (Sandbox Code Playgroud)