web-dev-qa-db-ja.com

ディレクトリの末尾にスラッシュを使用する必要があるのはいつですか?

可能性のある複製:
Linuxが複数のパス区切り文字を処理する方法(/ home //// username /// file)

Linuxで使用するほとんどのコマンドは、ディレクトリ名の末尾にスラッシュ/文字を含めても、まったく同じように動作します。

例えば:

ls /home/cklein
ls /home/cklein/

cp foo bar
cp foo/ bar/

この末尾のスラッシュはいつ重要ですか?末尾のスラッシュの意味的な意味は何ですか?

61
Cory Klein

1つの良い例は、ファイルをディレクトリに移動することです。

mv some_file foo

vs.

mv some_file foo/

fooが存在しない場合、最初の名前は、意図したsome_fileではなくfoo/some_filefooに名前変更します。 2番目はあなたが望むものであると文句を言うでしょう。

fooは存在するがディレクトリではない場合、最初のものがfooファイルを破壊する可能性があります。再び、2番目は文句を言うでしょう。

cpにも同様の問題があります。

一部の古いバージョンのSunOSで作業しているときに、システムが実際にファイル名の末尾の/.を無視したため、/を追加する習慣をつけました。たとえば、/etc/motd/はエラーではなくファイルを参照します。 SunOS/Solarisのそれ以降のバージョンでは、そのような問題はないようです。

48
Keith Thompson

完全にツールに依存します。 rmでは、末尾にスラッシュがある場合、ディレクトリへのシンボリックリンクを削除できません。ソースファイルの指定に末尾にスラッシュがある場合、rsyncは別のことを行います。

foo/foo/.に似ているため、fooがディレクトリへのシンボリックリンクの場合、foo/はディレクトリ(シンボリックリンクではない)であり、fooの場合がディレクトリでもディレクトリへのシンボリックリンクでもない場合、foo/にアクセスしようとするとENOTDIRエラーが発生します。これがLinuxでの動作です。

他のシステムでは動作が異なる場合があります。

hereherehere を参照して、POSIX/SUSがそれについて述べていることを確認してください。

16

Rsyncでは、manページは次のようになります。

   A trailing slash on the source changes this behavior to avoid  creating
   an  additional  directory level at the destination.  You can think of a
   trailing / on a source as meaning "copy the contents of this directory"
   as  opposed  to  "copy  the  directory  by name", but in both cases the
   attributes of the containing directory are transferred to the  contain-
   ing  directory on the destination.  In other words, each of the follow-
   ing commands copies the files in the same way, including their  setting
   of the attributes of /dest/foo:

          rsync -av /src/foo /dest
          rsync -av /src/foo/ /dest/foo

destinationの末尾のスラッシュは関係ありません。ソースのみ。 (そしてもちろん、ソースが単一のファイルやグロブではなくディレクトリであるかどうかだけが重要です。)

ディレクトリ間の使用例を説明するには:

$ mkdir foo bar baz
$ chmod 700 foo
$ chmod 750 bar
$ chmod 705 baz
$ echo hello > foo/file1
$ chmod 606 foo/file1 
$ ls -n
total 0
drwxr-x---  2 501  20   68 Aug  8 15:29 bar/
drwx---r-x  2 501  20   68 Aug  8 15:29 baz/
drwx------  3 501  20  102 Aug  8 15:30 foo/
$ ls -n foo
total 8
-rw----rw-  1 501  20  6 Aug  8 15:30 file1
$ rsync -a foo bar
$ rsync -a foo baz/
$ rsync -a foo bif
$ rsync -a foo bonk/
$ ls -n
total 0
drwxr-x---  3 501  20  102 Aug  8 15:30 bar/
drwx---r-x  3 501  20  102 Aug  8 15:30 baz/
drwxr-xr-x  3 501  20  102 Aug  8 15:30 bif/
drwxr-xr-x  3 501  20  102 Aug  8 15:30 bonk/
drwx------  3 501  20  102 Aug  8 15:30 foo/
$ ls -n *
bar:
total 0
drwx------  3 501  20  102 Aug  8 15:30 foo/

baz:
total 0
drwx------  3 501  20  102 Aug  8 15:30 foo/

bif:
total 0
drwx------  3 501  20  102 Aug  8 15:30 foo/

bonk:
total 0
drwx------  3 501  20  102 Aug  8 15:30 foo/

foo:
total 8
-rw----rw-  1 501  20  6 Aug  8 15:30 file1
$ rm -rf b*
$ mkdir bar baz
$ chmod 750 bar
$ chmod 705 baz
$ rsync -a foo/ bar
$ rsync -a foo/ baz/
$ rsync -a foo/ bif
$ rsync -a foo/ bonk/
$ ls -n
total 0
drwx------  3 501  20  102 Aug  8 15:30 bar/
drwx------  3 501  20  102 Aug  8 15:30 baz/
drwx------  3 501  20  102 Aug  8 15:30 bif/
drwx------  3 501  20  102 Aug  8 15:30 bonk/
drwx------  3 501  20  102 Aug  8 15:30 foo/
$ ls -n *
bar:
total 8
-rw----rw-  1 501  20  6 Aug  8 15:30 file1

baz:
total 8
-rw----rw-  1 501  20  6 Aug  8 15:30 file1

bif:
total 8
-rw----rw-  1 501  20  6 Aug  8 15:30 file1

bonk:
total 8
-rw----rw-  1 501  20  6 Aug  8 15:30 file1

foo:
total 8
-rw----rw-  1 501  20  6 Aug  8 15:30 file1
$ 
6
Wildcard