100

因此,绝对路径是一种到达某个文件或位置的方法,该文件或位置描述了到它的完整路径、完整路径以及它与操作系统相关的内容(例如,Windows 和 Linux 的绝对路径是不同的)。另一方面,相对路径是从当前位置(两个点)描述的文件或位置的路径,..表示目录树中的上级。多年来,我一直很清楚这一点。

在搜索时,我什至看到也有规范化的文件!我所知道的是,CANONICAL 意味着“根据规则”之类的东西。

有人可以启发我关于规范事物的理论吗?

4

5 回答 5

108

制作任何“规范”的全部目的是让您可以比较两件事。例如,两者../../here/bar/x./test/../../bar/x可能都指向同一个位置,但您不能对这两个路径进行文本比较。然而,如果你把它们变成它们的规范表示,它们都变成../bar/x,我们看到它们实际上指的是同一个东西。

简而言之,通常情况下,您有多种方式来引用一件事,在这种情况下,您可以定义一个唯一的规范表示,并允许您处理此类事物的集合。

(如果您正在寻找更多示例,所有数学都充满了各种对象的“规范”构造,并且非常具有相同的目的。也许这篇维基百科文章可以提供一些额外的方向。)

于 2012-08-23T21:38:10.907 回答
38

定义规范路径的一个好方法是:(the shortest absolute path短,在字符串长度的含义中)。

这是绝对路径和规范路径之间差异的示例:

绝对路径: C:\abc\..\abc\file.txt
规范路径:C:\abc\file.txt

于 2012-08-23T21:38:38.823 回答
6

什么是规范路径(或其与绝对路径的区别)取决于系统。
通常,如果(完整)路径包含别名、快捷方式或符号链接,则规范路径会将所有这些解析为它们所引用的实际目录。
示例:如果/bin/a是符号链接,您可以在任何您请求绝对路径的地方找到它,例如从java.io.File#getAbsolutePath而真实文件(即链接的实际目标)即usr/local/bin/a作为规范路径返回,例如来自java.io.File#getCanonicalPath

于 2012-08-23T21:44:51.220 回答
2

当您传递目录而不是文件的名称时,会出现规范路径的大多数问题。对于文件,如果我们提供的绝对路径也是规范路径。但对于 dir,它意味着省略最后一个“/”。例如,“/var/tmp/foo”是规范路径,而“/var/tmp/foo/”不是。

于 2018-01-31T09:11:41.443 回答
1

GNU Coreutils的文档中给出了规范路径的良好定义。readlink指定“规范化模式”返回不包含任何这些内容的等效路径:

  1. 指向自身 (.) 和父 (..) 目录的硬链接
  2. 重复的分隔符 (/)
  3. 符号链接

字符串长度无关紧要,如以下示例所示。

如果您正在运行 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
于 2021-11-04T07:14:14.997 回答