有没有一条命令可以根据相对路径获取绝对路径?
例如,我想让$line包含dir目录下每个文件的绝对路径:./etc/
find ./ -type f | while read line; do
echo $line
done
有没有一条命令可以根据相对路径获取绝对路径?
例如,我想让$line包含dir目录下每个文件的绝对路径:./etc/
find ./ -type f | while read line; do
echo $line
done
尝试使用realpath
函数。
~ $ sudo apt-get install realpath # may already be installed
~ $ realpath .bashrc
/home/username/.bashrc
realpath -s
。realpath
命令可用。 :-( - András Aszódirealpath
命令。 - user5359531brew install coreutils
命令会安装 realpath
。 - Kevin Chenrealpath
已经存在了。我不需要单独安装它。 - Asclepiusrealpath
在 Git for Windows 上是可用的(至少对我来说是这样)。 - Andrew Keetonreadlink -f relative_file_name
来检索绝对路径(解析所有符号链接)。brew install coreutils
,这个命令是可以工作的。然而,可执行文件前面会加上一个g:greadlink -f relative_file_name
。 - Miguel Isla#! /bin/sh
echo "$(cd "$(dirname "$1")"; pwd)/$(basename "$1")"
更新:一些说明
"$1"
dirname "$1"
cd "$(dirname "$1")
进入这个相对目录并通过运行pwd
shell命令获取其绝对路径$(basename "$1")
echo
输出它pwd
命令中提供-P
选项:echo "$(cd "$(dirname "$1")"; pwd -P)/$(basename "$1")"
。请注意,这段话已经被翻译成中文。 - Eugen Konkov使用:
find "$(pwd)"/ -type f
获取所有文件或
echo "$(pwd)/$line"
显示完整路径(如果相对路径很重要)
就我所知,我投了被选中的答案,但我想分享一种解决方案。缺点是它只适用于Linux——在来到Stack Overflow之前,我花了大约5分钟尝试寻找OSX的等效方法。不过我相信它一定存在。
在Linux中,你可以使用readlink -e
与dirname
结合使用。
$(dirname $(readlink -e ../../../../etc/passwd))
产生。/etc/
然后你使用dirname
的姐妹函数basename
, 只获取文件名
$(basename ../../../../../passwd)
产出。passwd
把所有东西放在一起...
F=../../../../../etc/passwd
echo "$(dirname $(readlink -e $F))/$(basename $F)"
产出。/etc/passwd
如果你的目标是一个目录,basename
函数将返回空值,并且你最终的输出结果只会有双斜杠。
dirname
、readlink
和basename
的出色入口。这帮助我获取符号链接的绝对路径,而不是其目标。 - kevinarpe/home/GKFX
目录下,然后输入touch newfile
,在我按回车键之前,你就可以推断出我的意思是“创建/home/GKFX/newfile
”,这是一个绝对路径,指向一个尚不存在的文件。 - GKFX我认为这是最便携的:
abspath() {
cd "$(dirname "$1")"
printf "%s/%s\n" "$(pwd)" "$(basename "$1")"
cd "$OLDPWD"
}
如果路径不存在,它将失败。
dirname
是 GNU 核心实用程序,我认为并不常见于所有的 Unix 系统。 - einpoklumdirname
是POSIX标准实用程序,请参见此处:http://pubs.opengroup.org/onlinepubs/9699919799/utilities/dirname.html - Ernest A${1##*/}
的版本,现在我用basename "$1"
替换了那个垃圾,看起来终于可以正确处理以/结尾的路径了。 - l3l_azerealpath
可能是最佳选择。
但是……
最初的问题非常混乱,示例与所述问题关系不大。
所选答案实际上回答了给出的示例,而不是标题中的问题。第一个命令就是答案(确实吗?我怀疑),并且可以不带“/'”使用。我看不出第二个命令在做什么。
有几个问题被混合:
将相对路径名更改为绝对路径名,无论它表示什么,可能是空的。
(通常,如果您发出类似于 touch foo/bar
的命令,则必须存在路径名 foo/bar
,并且可能在计算中使用,然后才会创建文件。)
可能有几个绝对路径名表示相同的文件(或潜在文件),特别是由于路径上的符号链接(symlinks),但可能是出于其他原因 (设备可能被挂载两次作为只读)。人们可能想要显式解决此类符号链接。
到达一系列符号链接的末端,指向非符号链接文件或名称。这可能会产生绝对路径名,也可能不会,具体取决于如何完成。人们可以,或者不想将其解析为绝对路径名。
命令readlink foo
没有选项只有当它的参数foo
是一个符号链接时才给出答案,该答案是该符号链接的值。不遵循其他链接。答案可能是相对路径:符号链接参数的值是什么就是什么。
但是,readlink
有选项(-f -e或-m),这些选项适用于所有文件,并为实际由参数表示的文件提供一个绝对路径名(没有符号链接)。
这对于任何不是符号链接的东西都可以正常工作,尽管人们可能希望使用绝对路径名而不解析中间的链接,因此realpath
可能是最佳选择。
在路径中使用符号链接。这可以通过命令realpath -s foo
来完成。
对于符号链接参数,readlink
以其选项将再次解析所有绝对路径上的符号链接,但
这也包括跟随参数值可能遇到的所有符号链接。如果您想要一个
指向参数符号链接本身而不是它链接到的任何东西的绝对路径,则可能不希望如此。同样,如果foo
是一个符号链接,则realpath -s foo
将获得不解析符号链接的绝对路径,包括作为参数给出的那个符号链接。
没有-s
选项,realpath
和readlink
基本相同,除了简单读取链接的值以及其他几件事情。我只是不清楚为什么readlink
有其选项,似乎会创建不必要的冗余与realpath
。
探索网络并没有说太多,除了各种系统可能存在差异。
结论:至少对于此处请求的用途而言,realpath
是最好的命令,具有最大的灵活性。
readlink
的man页面说:“请注意,realpath(1)是用于规范化功能的首选命令。” - jarno我最喜欢的解决方案是这个,因为它不意味着存在其他实用程序(coreutils包)。
但它对于相对路径“。”和“..”失败了,因此这里有一个稍微改进的版本来处理这些特殊情况。
如果用户没有权限进入相对路径的父目录,则它仍然会失败,
#! /bin/sh
# Takes a path argument and returns it as an absolute path.
# No-op if the path is already absolute.
function to-abs-path {
local target="$1"
if [ "$target" == "." ]; then
echo "$(pwd)"
elif [ "$target" == ".." ]; then
echo "$(dirname "$(pwd)")"
else
echo "$(cd "$(dirname "$1")"; pwd)/$(basename "$1")"
fi
}
absolute="$(cd $(dirname \"$file\"); pwd)/$(basename \"$file\")"
顺便提一下,您目前的工作目录不会受到影响。
absolute_path() {
cd "$(dirname "$1")"
case $(basename $1) in
..) echo "$(dirname $(pwd))";;
.) echo "$(pwd)";;
*) echo "$(pwd)/$(basename $1)";;
esac
}
这样可以正确处理路径的最后一个元素为 ..
的情况,此时 @ernest-a 的答案中的 "$(pwd)/$(basename "$1")"
将被解析为 accurate_sub_path/spurious_subdirectory/..
。