Unix:目录名后是否加斜杠


13

以下命令之间有什么区别?

mv foo bar
mv foo/ bar/
mv foo/ bar
mv foo bar/

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


2
对于rsync是正确的。它根据目录本身或目录下的项目开始复制,具体取决于您是跳过还是添加斜杠。
maxelost

@maxelost:您可以添加一些示例的答案,这样很明显是做什么的吗?
Svish

我想,米克尔在下面很清楚地回答了这个问题。
maxelost 2011年

Answers:


17

许多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有一个-followor -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.bakdirdir.bak,使得dirdir.bak
  • rsync dir/ dir.bak复制的所有内容dir,而无需在dir内部进行复制dir.bak

2

正如jsalonen已经说过的,如果foo并且bar实际上是目录,这些命令的确具有相同的结果。

但是,如果foobar不是目录,那么如果添加尾部斜杠,该命令将失败,否则,该命令将成功。问题是,如果命令成功执行,则可能不会获得您想要的结果。实际上,如果foobar是文件,您甚至可能会丢失数据(bar将被覆盖)。

如果您打算指定目录而不是文件,则应使用斜杠,因为这会使命令更加健壮:如果对fooor 的期望bar失败,则该命令将正常运行,而不会有意外结果。

另外,某些(罕见)命令的行为取决于尾部斜杠的存在,即使对于目录也是如此(一个示例是rsync)。


是的,正如我所暗示的,命令可能会也可能不会很好地处理斜杠。您提供rsync作为示例非常好!
jsalonen 2011年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.