因此,绝对路径是一种到达某个文件或位置的方法,该文件或位置描述了到它的完整路径、完整路径以及它与操作系统相关的内容(例如,Windows 和 Linux 的绝对路径是不同的)。另一方面,相对路径是从当前位置(两个点)描述的文件或位置的路径,..
表示目录树中的上级。多年来,我一直很清楚这一点。
在搜索时,我什至看到也有规范化的文件!我所知道的是,CANONICAL 意味着“根据规则”之类的东西。
有人可以启发我关于规范事物的理论吗?
因此,绝对路径是一种到达某个文件或位置的方法,该文件或位置描述了到它的完整路径、完整路径以及它与操作系统相关的内容(例如,Windows 和 Linux 的绝对路径是不同的)。另一方面,相对路径是从当前位置(两个点)描述的文件或位置的路径,..
表示目录树中的上级。多年来,我一直很清楚这一点。
在搜索时,我什至看到也有规范化的文件!我所知道的是,CANONICAL 意味着“根据规则”之类的东西。
有人可以启发我关于规范事物的理论吗?
制作任何“规范”的全部目的是让您可以比较两件事。例如,两者../../here/bar/x
和./test/../../bar/x
可能都指向同一个位置,但您不能对这两个路径进行文本比较。然而,如果你把它们变成它们的规范表示,它们都变成../bar/x
,我们看到它们实际上指的是同一个东西。
简而言之,通常情况下,您有多种方式来引用一件事,在这种情况下,您可以定义一个唯一的规范表示,并允许您处理此类事物的集合。
(如果您正在寻找更多示例,所有数学都充满了各种对象的“规范”构造,并且非常具有相同的目的。也许这篇维基百科文章可以提供一些额外的方向。)
定义规范路径的一个好方法是:(the shortest absolute path
短,在字符串长度的含义中)。
这是绝对路径和规范路径之间差异的示例:
绝对路径: C:\abc\..\abc\file.txt
规范路径:C:\abc\file.txt
什么是规范路径(或其与绝对路径的区别)取决于系统。
通常,如果(完整)路径包含别名、快捷方式或符号链接,则规范路径会将所有这些解析为它们所引用的实际目录。
示例:如果/bin/a
是符号链接,您可以在任何您请求绝对路径的地方找到它,例如从java.io.File#getAbsolutePath而真实文件(即链接的实际目标)即usr/local/bin/a
作为规范路径返回,例如来自java.io.File#getCanonicalPath
当您传递目录而不是文件的名称时,会出现规范路径的大多数问题。对于文件,如果我们提供的绝对路径也是规范路径。但对于 dir,它意味着省略最后一个“/”。例如,“/var/tmp/foo”是规范路径,而“/var/tmp/foo/”不是。
GNU Coreutils的文档中给出了规范路径的良好定义。readlink
指定“规范化模式”返回不包含任何这些内容的等效路径:
字符串长度无关紧要,如以下示例所示。
如果您正在运行 linux 或使用 GNU Coreutils ,您可以尝试readlink -f
(规范化模式)或其首选等效命令realpath
,以查看系统上某些程序的“绝对路径”和“规范绝对路径”之间的区别。
我可以使用在我的系统上获取“java”的路径which
$ which java
/usr/bin/java
然而,这条路径实际上是指向另一个符号链接的符号链接。此符号链接链可以使用 显示namei
。
$ namei $(which java)
f: /usr/bin/java
d /
d usr
d bin
l java -> /etc/alternatives/java
d /
d etc
d alternatives
l java -> /usr/lib/jvm/java-17-openjdk-amd64/bin/java
d /
d usr
d lib
d jvm
d java-17-openjdk-amd64
d bin
- java
可以使用前面提到的realpath
命令找到规范路径。
$ realpath $(which java)
/usr/lib/jvm/java-17-openjdk-amd64/bin/java