ディレクトリパスの末尾に/を含めることと省略することの違い

ディレクトリパスの末尾に/を含めることと省略することの違い

次のようにファイルパスの末尾に/を置くとどうなりますか?

root /var/www/website.com/

次のように省略します。

root /var/www/website.com

この問題はどのように処理されるか、違いは何ですか?

答え1

ディレクトリ名の後のスラッシュは、一部のプログラムでは重要ですが、他のプログラムでは重要ではありません。たとえば、

  • gitで/ファイル名の後に続くのは、単一のファイルではなくディレクトリだけを意味しますman 5 gitignore

    パターンがスラッシュで終わる場合は、以下で説明する目的で削除されますが、ディレクトリに一致するもののみを探します。つまり、foo /はfooディレクトリとその下のパスと一致しますが、通常のファイルやシンボリックリンクfooとは一致しません(これはgitのpathspecが一般的に機能する方法と一致します)。

  • lsに(からウィキペディア):

    ディレクトリを指すシンボリックリンクのディレクトリリストを要求すると、リンク
    自体のみが表示されます。
    リンクされたディレクトリのリストを取得するには、パスに次の
    ディレクトリ区切り文字( "/"、スラッシュ)を含める必要があります。

  • しかし、今は覚えていない他のいくつかのプログラム(主に私が見たEmacsマクロ)は通常のファイルの代わりにディレクトリだけを必要とし、両方を許可し、必要に応じてdir参照をdir/追加します。/dir

nginxがどのように機能するのかわかりませんが、一度見てくださいムルの答え

答え2

通常、後ろにスラッシュがないパスはあいまいです。これはファイルでもディレクトリでもかまいません。スラッシュのあるパスはディレクトリのみにすることができます。ほとんどのシェルは、タブ補完を使用すると自動的に末尾のスラッシュを提供します。

これは常に末尾のスラッシュを使用する必要があるわけではなく、実際には一部のプログラムではこれを許可しません。他の人が言ったように、状況によって異なります。プログラムごとに、その解釈が異なります。

末尾のスラッシュが大きな違いを生む例はですrsync

ディレクトリsourceとが与えられると、targetこのコマンドはrsync -a source targetすべての内容をにコピーしますtarget/source。ただし、後ろにスラッシュがあると、サブディレクトリを作成せずにrsync -a source/ targetコンテンツが直接コピーさsourceれます。targettarget/source

私はしばしばこの動作が混乱しているので、暗黙的なサブディレクトリの作成に頼るのではなく、直接書くことを好みます。場合によっては、サブディレクトリがすでに存在するため、/.不要なサブディレクトリが作成されないようにするために末尾を使用することがあります。.

答え3

文脈が重要です。の場合、場所をnginx指定するときにディレクトリであることがわかってもroot違いはありません。nginxしかし、他の場所にも影響を与える可能性があるためデュアルスラッシュはURLに問題を引き起こす可能性があります。(つまり、blah/$request_uriオーバーライドまたはプロキシ時に同様のタスクを実行する場合)

通常、* nixプラットフォームの場合、これには違いはありません。いくつかの例外があります:

  • rsync動作は、ソースディレクトリパスにスラッシュがあるかどうかによって異なります。rsyncが末尾のスラッシュを処理する方法の良い例
  • 後ろにスラッシュを追加すると、アプリケーションが誤ってファイルを生成するのではなく、ディレクトリを探していることがわかります。

    cp blah non-existent-directory
    cp blah non-existent-directory2/
    
  • 上記と同様に、globbingではディレクトリにのみ強制的に拡張することができます。

    $ printf "%s\n" * | wc -l
    26
    $ printf "%s\n" */ | wc -l
    20
    

    この例をご了承ください。これはかなり標準的なUbuntuインストールのルートで行われるため、この例では奇妙な名前は破損しません。

答え4

シェルに入力する場合:

    CDパス/somedir

現在のディレクトリを次に移動します。パス/ディレクトリ
しかし、次のように入力すると:

    CDパス/somedir/

次のように印刷されます。

    bash: cd: path/somedir/: そのファイルやディレクトリはありません。

おそらく、その/文字はパスが不完全であるがまだ続くことを意味するので、後ろに何も入れないと存在しないファイルを参照するのと同じです。

関連情報