Muitos utilitários Unix tratam os links simbólicos de forma diferente, dependendo se há uma barra final.
Esse comportamento é descrito na documentação do POSIX Symbolic Link e também é mencionado em a documentação GNU coreutils .
Basicamente, a barra à direita significa seguir (ou "desreferenciar") o link simbólico.
Por exemplo, no código abaixo, dirlink
significa o symlink, mas dirlink/
significa o diretório para o qual o symlink aponta. rm
não removerá um diretório, a menos que você diga rm -r
, mas rm
sem opções terá prazer em remover um link simbólico.
$ 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
Também é útil para visualizar as permissões de um diretório, sem ter que se preocupar se o diretório é um diretório real ou apenas um link simbólico para um diretório.
$ 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/
e ainda funciona para diretórios comuns:
$ 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/
Outro exemplo é o comando find
. Se o path
que você pede para pesquisar é um link simbólico, ele não seguirá o link simbólico por padrão, o que significa que ele só processa o link simbólico. Adicionar uma barra à direita faz com que o symlink seja tratado como o diretório para o qual o link aponta.
$ find dir
dir
dir/file
$ find dirlink
dirlink
$ find dirlink/
dirlink/
dirlink/file
(algumas versões do find têm uma opção -follow
ou -L
, mas isso faz com que ele siga todos os links simbólicos, não apenas o primeiro)
No caso de rsync
, se você deve acrescentar uma barra depende se você deseja que o diretório que você está copiando seja um subdiretório ou não.
$ 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
Em outras palavras:
-
rsync dir dir.bak
copiadir
emdir.bak
, tornandodir
dentro dedir.bak
-
rsync dir/ dir.bak
copia todo o conteúdo dedir
, sem fazerdir
dentro dedir.bak