Muitos utilitários Unix tratam links simbólicos de maneira diferente, dependendo de haver uma barra final.
Esse comportamento é descrito na documentação do POSIX Symbolic Link e também é mencionado na documentação do coreUtil GNU .
Basicamente, a barra final significa seguir (ou "desreferenciar") o link simbólico.
Por exemplo, no código abaixo, dirlink
significa o link simbólico, mas dirlink/
o diretório para o qual o link simbólico aponta. rm
não removerá um diretório, a menos que você o diga rm -r
, mas rm
sem as opções removerá felizmente 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 exibir 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 regulares:
$ 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 find
comando. Se path
você solicitar a pesquisa for um link simbólico, ele não seguirá o link simbólico por padrão, o que significa que processa apenas o link simbólico. Adicionar uma barra final faz com que ele trate o link simbólico 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
cópias dir
em dir.bak
, fazendo dir
dentrodir.bak
rsync dir/ dir.bak
copia todo o conteúdo de dir
, sem fazer dir
dentrodir.bak