Unix: Barra após nomes de diretório ou não

13

Qual é a diferença entre os seguintes comandos?

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

Ou não há diferença? Ou isso depende do comando que está sendo usado? Pense, por exemplo, que li que o comportamento do rsync muda um pouco, dependendo da versão que você usa. Alguém tem uma boa explicação para não precisar mais adivinhar e sentir que sei o que estou fazendo?

Svish
fonte
2
É verdade para o rsync. Ele inicia a cópia com o próprio diretório ou com os itens sob ele, dependendo de você pular ou adicionar a barra final, respectivamente.
maxelost 2/02
@ maxelost: Você poderia adicionar uma resposta com alguns exemplos, para que fique claro o que faz o quê?
Svish 02/02
Mikel respondeu claramente, acho.
Maxelost

Respostas:

17

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, dirlinksignifica o link simbólico, mas dirlink/o diretório para o qual o link simbólico aponta. rmnão removerá um diretório, a menos que você o diga rm -r, mas rmsem 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 findcomando. Se pathvocê 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 -followou -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.bakcópias direm dir.bak, fazendo dirdentrodir.bak
  • rsync dir/ dir.bakcopia todo o conteúdo de dir, sem fazer dirdentrodir.bak
Mikel
fonte
2

Como jsalonen já disse, esses comandos realmente têm resultados idênticos se fooe barsão, de fato, diretórios.

No entanto, se fooe barnão forem diretórios, o comando falhará se você anexar uma barra final e terá êxito se não o fizer. O problema é que, se o comando for bem-sucedido, provavelmente não terá o resultado que você pretendia. De fato, você pode até perder dados se fooe barforem arquivos ( barseriam substituídos).

Se sua intenção é para especificar diretórios e não arquivos, então você deve usar uma barra no final, porque faz com que o comando mais robusto: se a expectativa de que fooou barsão diretórios falhar, o comando irá falhar normalmente, em vez de ter resultados inesperados.

Além disso, alguns comandos (raros) se comportam de maneira diferente, dependendo da presença de uma barra final, mesmo com diretórios (um exemplo é rsync).

Etienne Dechamps
fonte
Sim, como eu impliquei, os comandos podem ou não lidar com barras à direita. É muito bom que você forneceu o rsync como exemplo!
jsalonen