将相对路径转换为绝对路径?

jos*_*osh 56 unix shell perl path absolute-path

我不确定这些路径是否重复.给定相对路径,如何使用shell脚本确定绝对路径?

例:

relative path: /x/y/../../a/b/z/../c/d

absolute path: /a/b/c/d
Run Code Online (Sandbox Code Playgroud)

buk*_*zor 52

我在unix中遇到的最可靠的方法是readlink -f:

$ readlink -f /x/y/../../a/b/z/../c/d
/a/b/c/d
Run Code Online (Sandbox Code Playgroud)

一些警告:

  1. 这也有解决所有符号链接的副作用.这可能是也可能不是,但通常是.
  2. readlink如果您引用一个不存在的目录,将给出一个空白结果.如果要支持不存在的路径,请readlink -m改用.不幸的是,在2005年之前发布的readlink版本中不存在此选项.

  • [OS X上不提供readlink -f](http://superuser.com/questions/205127/how-to-retrieve-the-absolute-path-of-an-arbitrary-file-from-the-os- X). (7认同)

DVK*_*DVK 49

这个来源来:

#!/bin/bash

# Assume parameter passed in is a relative path to a directory.
# For brevity, we won't do argument type or length checking.

ABS_PATH=`cd "$1"; pwd` # double quotes for paths that contain spaces etc...
echo "Absolute path: $ABS_PATH"
Run Code Online (Sandbox Code Playgroud)

您也可以使用Perl单线程,例如使用 Cwd::abs_path

  • 更新了适用于文件的Perl解决方案 (4认同)
  • 非常好.如果文件名也给出了怎么办?像/x/y/../../a/b/z/../c/d.txt => /a/b/c/d.txt (3认同)
  • 有趣的是,如果指定的路径不存在,`Cwd :: abs_path`将失败. (3认同)

oli*_*bre 19

使用

# Directory
relative_dir="folder/subfolder/"
absolute_dir="$( cd "$relative_dir" && pwd )"

# File
relative_file="folder/subfolder/file"
absolute_file="$( cd "${relative_file%/*}" && pwd )"/"${relative_file##*/}"
Run Code Online (Sandbox Code Playgroud)
  • ${relative_file%/*} 与...相同的结果 dirname "$relative_file"
  • ${relative_file##*/} 与...相同的结果 basename "$relative_file"

注意事项:不解析符号链接(即不规范化路径)=>如果使用符号链接,则无法区分所有重复项.


运用 realpath

命令realpath完成这项工作.另一种方法是使用readlink -e(或readlink -f).但是realpath通常不会默认安装.如果您无法确定realpathreadlink存在,可以使用perl替换它(见下文).


使用

如果realpath您的系统中没有,Steven Kramer会提出一个shell别名:

$ alias realpath="perl -MCwd -e 'print Cwd::realpath(\$ARGV[0]),qq<\n>'"
$ realpath path/folder/file
/home/user/absolute/path/folder/file
Run Code Online (Sandbox Code Playgroud)

或者如果你喜欢直接使用perl:

$ perl -MCwd -e 'print Cwd::realpath($ARGV[0]),qq<\n>' path/folder/file
/home/user/absolute/path/folder/file
Run Code Online (Sandbox Code Playgroud)

这个单行perl命令使用Cwd::realpath.实际上有三个perl函数.它们采用单个参数并返回绝对路径名.以下详细信息来自文档Perl5>核心模块> Cwd.

这些函数仅在request =>时导出,因此用于Cwd避免arielf指出的"Undefined subroutine"错误.如果要导入所有这三个函数,可以使用一行:use Cwd

use Cwd qw(abs_path realpath fast_abs_path);
Run Code Online (Sandbox Code Playgroud)

  • 具有合适Perl但没有`realpath`安装的发行版的单行版本:`alias realpath ="perl -MCwd -e'print Cwd :: realpath($ ARGV [0]),qq <\n>'"` (3认同)

Ste*_*eMc 18

看看'realpath'.

$ realpath

usage: realpath [-q] path [...]

$ realpath ../../../../../

/data/home
Run Code Online (Sandbox Code Playgroud)