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

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

ファイル パスの最後に / を残した場合、何が起こるかに違いがあるかどうか疑問に思っています。たとえば、次のようになります。

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がどのように動作するのかは分かりませんが、muruの答え

答え2

一般的に、末尾にスラッシュがないパスはあいまいです。ファイルまたはディレクトリのどちらかである可能性があります。末尾にスラッシュがあるパスはディレクトリのみになります。ほとんどのシェルでは、タブ補完を使用すると末尾のスラッシュが自動的に表示されます。

これは、常に末尾のスラッシュを使用する必要があるという意味ではありません。実際、一部のプログラムではスラッシュの使用が禁止されています。他の人が述べたように、これはコンテキストによって異なります。各プログラムによって解釈が異なります。

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

ディレクトリsourceとが指定されている場合target、コマンドはrsync -a source targetすべてを にコピーしますtarget/source。ただし、末尾にスラッシュを付けると、サブディレクトリを作成せずにrsync -a source/ targetのコンテンツがsourcetarget直接コピーされますtarget/source

私はこの動作によく困惑するので、暗黙的なサブディレクトリ作成に頼るのではなく、書き出すことを好みます。サブディレクトリが既に存在する/.ため、不要なサブディレクトリが作成されないようにするために、末尾に付けることもあります.

答え3

コンテキストは非常に重要です。 の場合、 を場所としてnginx指定しても、 はそれがディレクトリであることを知っているので、何の違いもありません。しかし、他の場所では違いが生じる可能性があります。rootnginx二重スラッシュはURLに問題を引き起こす可能性がある(つまり、blah/$request_uri書き換え中やプロキシ中など何かを行う場合)。

一般的に、*nix プラットフォームに関しては違いはありません。ただし、いくつか例外があります。

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

    cp blah non-existent-directory
    cp blah non-existent-directory2/
    
  • 上記と同様に、グロブでは、ディレクトリのみへの拡張を強制するために使用できます。

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

    この例をお許しください。これは、かなり標準的な Ubuntu インストールのルートで実行されるため、この例の実行中に奇妙な名前が損なわれることはありません。

答え4

シェルに次のように入力した場合:

    cd パス/somedir

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

    cd パス/somedir/

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

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

おそらく、この/文字はパスが完全ではなく継続していることを意味しているため、その後に何も付けないと、存在しないファイルを参照するのと同じになります。

関連情報