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