以下命令之间有什么区别?
mv foo bar
mv foo/ bar/
mv foo/ bar
mv foo bar/
还是没有区别?还是取决于所使用的命令?以我为例,我读到rsync行为根据您使用的版本而有所变化。有没有人有一个很好的解释,所以我不必再猜测了,感觉我知道我在做什么?
以下命令之间有什么区别?
mv foo bar
mv foo/ bar/
mv foo/ bar
mv foo bar/
还是没有区别?还是取决于所使用的命令?以我为例,我读到rsync行为根据您使用的版本而有所变化。有没有人有一个很好的解释,所以我不必再猜测了,感觉我知道我在做什么?
Answers:
许多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
这对于查看目录的权限也很有用,而不必理会目录是真实目录还是只是目录的符号链接。
$ 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/
它仍然适用于常规目录:
$ 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/
另一个示例是find
命令。如果path
您要求它搜索的是符号链接,则默认情况下它不会跟随该符号链接,这意味着它仅处理该符号链接。添加尾斜杠使其将符号链接视为链接指向的目录。
$ find dir
dir
dir/file
$ find dirlink
dirlink
$ find dirlink/
dirlink/
dirlink/file
(某些版本的find有一个-follow
or -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
换一种说法:
rsync dir dir.bak
张dir
成dir.bak
,使得dir
内dir.bak
rsync dir/ dir.bak
复制的所有内容dir
,而无需在dir
内部进行复制dir.bak
正如jsalonen已经说过的,如果foo
并且bar
实际上是目录,这些命令的确具有相同的结果。
但是,如果foo
和bar
不是目录,那么如果添加尾部斜杠,该命令将失败,否则,该命令将成功。问题是,如果命令成功执行,则可能不会获得您想要的结果。实际上,如果foo
和bar
是文件,您甚至可能会丢失数据(bar
将被覆盖)。
如果您打算指定目录而不是文件,则应使用斜杠,因为这会使命令更加健壮:如果对foo
or 的期望bar
失败,则该命令将正常运行,而不会有意外结果。
另外,某些(罕见)命令的行为取决于尾部斜杠的存在,即使对于目录也是如此(一个示例是rsync
)。