100

したがって、絶対パスは、特定のファイルまたは場所に到達するための方法であり、そのファイルへの完全なルート、完全なパス、およびOSに依存します(たとえば、WindowsとLinuxの絶対パスは異なります)。一方、相対パスは、現在の場所..(2つのドット)から記述されたファイルまたは場所へのルートであり、ディレクトリツリーの上位レベルを示します。それは私には数年前から明らかでした。

検索すると、正規化されたファイルもあることがわかりました。私が知っているのは、CANO​​NICALは「ルールに従う」などの意味であるということだけです。

誰かが標準的なものについての理論のサームで私を啓発することができますか?

4

5 に答える 5

108

何かを「標準的」にすることの全体的なポイントは、 2つのことを比較できるようにすることです。たとえば、との両方../../here/bar/x./test/../../bar/x同じ場所を参照している場合でも、2つのパスでテキストを比較することはできません。ただし、それらを標準表現に変換すると、両方ともになり../bar/x、実際には同じものを参照していることがわかります。

要するに、1つのものを参照する方法がたくさんある場合が多く、その場合は、そのようなもののコレクションを処理できる、一意の正規表現を定義できる場合があります。

(より多くの例を探している場合は、すべての数学があらゆる種類のオブジェクトの「標準的な」構造でいっぱいであり、同じ目的を念頭に置いています。おそらく、このウィキペディアの記事はいくつかの追加の方向性を提供できます。)

于 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の名前を渡すときに発生します。ファイルの場合、正規パスでもある絶対パスを提供している場合。ただし、dirの場合は、最後の「/」を省略することを意味します。たとえば、「/ var / tmp / foo」は正規のパスですが、「/ var / tmp /foo/」は正規のパスではありません。

于 2018-01-31T09:11:41.443 に答える
1

正規パスの適切な定義は、GNUCoreutilsのドキュメントに記載されています。readlink'Canonicalize mode'は、これらのいずれも持たない同等のパスを返すように指定されています。

  1. 自己(。)および親(..)ディレクトリへのハードリンク
  2. 繰り返しセパレーター(/)
  3. シンボリックリンク

次の例に示すように、文字列の長さは関係ありません。

readlink -fLinuxを実行している場合、またはGNU Coreutilsを使用している場合は、 (正規化モード)またはその推奨される同等のコマンドを試し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 に答える