/
无论我在目录名末尾是否包含尾部斜杠字符,我在 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
为foo
,而不是预期的foo/some_file
;第二个会抱怨,这正是你想要的。
如果foo
确实存在但不是目录,则第一个可以破坏该foo
文件;再次,第二个会抱怨。
cp
提出了类似的问题。
在使用一些旧版本的 SunOS 时,我养成了附加 的习惯/.
,因为系统实际上忽略了/
文件名的尾随;例如,/etc/motd/
将引用该文件而不是错误。 SunOS / Solaris 的更高版本似乎没有这个问题。
答案2
这是完全地依赖于工具。rm
如果末尾有斜杠,则不会让您删除目录的符号链接,并且如果源文件规范末尾有斜杠,则 rsync 会执行不同的操作。
答案3
答案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
$