Unix:目录名后是否加斜线

Unix:目录名后是否加斜线

以下命令有何区别?

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复制dirdir.bak,制作dir在里面dir.bak
  • rsync dir/ dir.bak复制所有内容dir,而不dir在内部进行dir.bak

答案2

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

但是,如果foobar不是目录,则如果您在末尾添加斜杠,则命令将失败,否则将成功。问题是,如果命令成功,它可能不会产生您想要的结果。事实上,如果 和 是foo文件barbar将被覆盖),您甚至可能会丢失数据。

如果你的目的是指定目录而不是文件,那么你应该使用尾随斜杠,因为它使命令更加健壮:如果期望foobar目录失败,则命令将正常失败,而不是产生意外结果。

此外,一些(罕见的)命令的行为会根据尾随斜杠的存在而有所不同,即使在目录中也是如此(一个例子是rsync)。

相关内容