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?
Respostas:
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, masdirlink/
o diretório para o qual o link simbólico aponta.rm
não removerá um diretório, a menos que você o digarm -r
, masrm
sem as opções removerá felizmente um link simbólico.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.
e ainda funciona para diretórios regulares:
Outro exemplo é o
find
comando. Sepath
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.(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.Em outras palavras:
rsync dir dir.bak
cópiasdir
emdir.bak
, fazendodir
dentrodir.bak
rsync dir/ dir.bak
copia todo o conteúdo dedir
, sem fazerdir
dentrodir.bak
fonte
Como jsalonen já disse, esses comandos realmente têm resultados idênticos se
foo
ebar
são, de fato, diretórios.No entanto, se
foo
ebar
nã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 sefoo
ebar
forem arquivos (bar
seriam 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
foo
oubar
sã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
).fonte