什么时候应该在目录上使用尾部斜杠?

什么时候应该在目录上使用尾部斜杠?

可能的重复:
linux如何处理多个路径分隔符(/home////用户名///文件)

/无论我在目录名末尾是否包含尾部斜杠字符,我在 Linux 中使用的大多数命令的行为都完全相同。

例如:

ls /home/cklein
ls /home/cklein/

cp foo bar
cp foo/ bar/

这个尾部斜杠什么时候很重要?尾部斜杠的语义是什么?

答案1

一个很好的例子是将文件移动到目录中:

mv some_file foo

mv some_file foo/

如果foo不存在,第一个将重命名some_filefoo,而不是预期的foo/some_file;第二个会抱怨,这正是你想要的。

如果foo确实存在但不是目录,则第一个可以破坏该foo文件;再次,第二个会抱怨。

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
$ 

相关内容