以下命令有何区别?
mv foo bar
mv foo/ bar/
mv foo/ bar
mv foo bar/
或者没有区别?还是取决于所使用的命令?例如,我读到 rsync 行为会根据您使用的版本而略有变化。有没有人能给出一个好的解释,这样我就不用再猜测了,感觉我知道自己在做什么?
答案1
许多 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
或-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
答案2
foo
正如 jsalonen 已经说过的,如果和bar
实际上是目录,这些命令确实具有相同的结果。
但是,如果foo
和bar
不是目录,则如果您在末尾添加斜杠,则命令将失败,否则将成功。问题是,如果命令成功,它可能不会产生您想要的结果。事实上,如果 和 是foo
文件bar
(bar
将被覆盖),您甚至可能会丢失数据。
如果你的目的是指定目录而不是文件,那么你应该使用尾随斜杠,因为它使命令更加健壮:如果期望foo
或bar
目录失败,则命令将正常失败,而不是产生意外结果。
此外,一些(罕见的)命令的行为会根据尾随斜杠的存在而有所不同,即使在目录中也是如此(一个例子是rsync
)。