ディレクトリにスラッシュをいつ使用する必要がありますか? [コピー]

ディレクトリにスラッシュをいつ使用する必要がありますか? [コピー]

重複の可能性:
Linuxはマルチパス区切り文字(/home////username///file)をどのように処理しますか?

/Linuxで使用されるほとんどのコマンドは、ディレクトリ名の末尾に末尾のスラッシュ文字が含まれているかどうかにかかわらず、まったく同じように機能します。

たとえば、

ls /home/cklein
ls /home/cklein/

cp foo bar
cp foo/ bar/

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

答え1

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

mv some_file foo

そして

mv some_file foo/

foo最初のものは存在しないと名前が変更され、期待どおりにsome_file変更されません。 2番目はまさにあなたが望むように文句を言います。foofoo/some_file

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

cp同様の質問が提起されました。

/.一部の以前のバージョンのSunOSでは、システムが実際に末尾のファイル名を無視したため、追加する習慣がありました/。つまり、/etc/motd/エラーの代わりにファイルが参照されます。 SunOS/Solaris の最新バージョンにはこの問題はないようです。

答え2

これは完全ツールによって異なります。rm末尾のスラッシュがある場合、ディレクトリへのシンボリックリンクを削除することはできません。ソースファイルの仕様に末尾のスラッシュがある場合、rsyncは動作が異なります。

答え3

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

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

バラよりここそしてここそしてここPOSIX / SUSがこれについてどのように話しているかを確認してください。

答え4

rsyncでは、マニュアルページは次のようになります。

   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

末尾のスラッシュ目的地まったく問題ではありません。ソースコードでのみ可能です。 (もちろん、ソースが単一ファイルまたはグローバル変数ではなくディレクトリである場合にのみ重要です。)

ディレクトリ間のユースケースの説明:

$ 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
$ 

関連情報