Unix:目录名后是否加斜杠

Svi*_*ish 14 unix

以下命令有什么区别?

mv foo bar
mv foo/ bar/
mv foo/ bar
mv foo bar/
Run Code Online (Sandbox Code Playgroud)

或者没有区别?还是取决于正在使用的命令?例如,我读到 rsync 行为会根据您使用的版本而有所变化。有没有人有一个很好的解释,这样我就不必再猜测了,觉得我知道自己在做什么?

Mik*_*kel 19

许多 Unix 实用程序根据尾部斜杠是否存在不同地对待符号链接。

此行为在POSIX 符号链接文档中有所描述,在GNU coreutils 文档中也有提及。

基本上,尾部斜杠意味着跟随(或“取消引用”)符号链接。

例如,在下面的代码中,dirlink表示符号链接,但dirlink/表示符号链接指向的目录。 rm除非你说rm -r,否则不会删除目录,但rm没有选项会很乐意删除符号链接。

$ mkdir dir
$ ln -s dir dirlink
$ ls -l
total 4
drwxr-xr-x 2 mikel mikel 4096 2011-02-02 22:26 dir
lrwxrwxrwx 1 mikel mikel    3 2011-02-02 22:26 dirlink -> dir
$ ls -l
total 4
drwxr-xr-x 2 mikel mikel 4096 2011-02-02 22:26 dir
lrwxrwxrwx 1 mikel mikel    3 2011-02-02 22:26 dirlink -> dir
$ rm dirlink/
rm: cannot remove `dirlink/': Is a directory
$ rm dirlink
$ ls -l
total 4
drwxr-xr-x 2 mikel mikel 4096 2011-02-02 22:26 dir
Run Code Online (Sandbox Code Playgroud)

它对于查看目录的权限也很有用,而不必担心目录是真实目录还是只是目录的符号链接。

$ ls -ld dirlink
lrwxrwxrwx 1 mikel mikel 3 2011-02-02 22:46 dirlink -> dir
$ ls -ld dirlink/
drwxr-xr-x 2 mikel mikel 4096 2011-02-02 22:46 dirlink/
Run Code Online (Sandbox Code Playgroud)

它仍然适用于常规目录:

$ ls -ld dir
drwxr-xr-x 2 mikel mikel 4096 2011-02-02 22:46 dir
$ ls -ld dir/
drwxr-xr-x 2 mikel mikel 4096 2011-02-02 22:46 dir/
Run Code Online (Sandbox Code Playgroud)

另一个例子是find命令。如果path您要求它搜索的是符号链接,则默认情况下它不会跟随符号链接,这意味着它只处理符号链接。添加尾部斜杠使其将符号链接视为链接指向的目录。

$ find dir
dir
dir/file
$ find dirlink
dirlink
$ find dirlink/
dirlink/
dirlink/file
Run Code Online (Sandbox Code Playgroud)

(某些版本的 find 有一个-follow-L选项,但这使它遵循所有符号链接,而不仅仅是第一个)


在 的情况下rsync,是否应该附加斜杠取决于您是否希望要复制的目录是子目录。

$ mkdir dir
$ touch dir/file
$ rsync -r dir dir.bak
$ find .
.
./dir
./dir/file
./dir.bak
./dir.bak/dir
./dir.bak/dir/file
$ rm -r dir.bak
$ rsync -r dir/ dir.bak
$ find .
.
./dir
./dir/file
./dir.bak
./dir.bak/file
Run Code Online (Sandbox Code Playgroud)

换句话说:

  • rsync dir dir.bak复制dirdir.bak, 在dir里面制作dir.bak
  • rsync dir/ dir.bak复制 的所有内容dir,不制作dir内部dir.bak