Многие утилиты 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