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)
一些警告:
readlink
如果您引用一个不存在的目录,将给出一个空白结果.如果要支持不存在的路径,请readlink -m
改用.不幸的是,在2005年之前发布的readlink版本中不存在此选项.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
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
通常不会默认安装.如果您无法确定realpath
或readlink
存在,可以使用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.
abs_path()
使用相同的算法getcwd()
.符号链接和相对路径组件(.
和..
)被解析为返回规范路径名,就像realpath
.
use Cwd 'abs_path';
my $abs_path = abs_path($file);
Run Code Online (Sandbox Code Playgroud)realpath()
是...的同义词 abs_path()
use Cwd 'realpath';
my $abs_path = realpath($file);
Run Code Online (Sandbox Code Playgroud)fast_abs_path()
是一个更危险,但可能更快的版本 abs_path()
use Cwd 'fast_abs_path';
my $abs_path = fast_abs_path($file);
Run Code Online (Sandbox Code Playgroud)这些函数仅在request =>时导出,因此用于Cwd
避免arielf指出的"Undefined subroutine"错误.如果要导入所有这三个函数,可以使用一行:use Cwd
use Cwd qw(abs_path realpath fast_abs_path);
Run Code Online (Sandbox Code Playgroud)
Ste*_*eMc 18
看看'realpath'.
$ realpath
usage: realpath [-q] path [...]
$ realpath ../../../../../
/data/home
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
47238 次 |
最近记录: |