O comportamento exigido pelo POSIX é que mv
interpreta uma barra como uma solicitação para excluir a referência do link simbólico. Ou seja, se foo
for um link simbólico, POSIX afirma que mv
(como qualquer outro comando) deve interpretar
mv foo/ bar/
como uma solicitação para mover o diretório apontado por foo
, em vez de foo
em si. Isso é indicado na seção sobre resolução do nome do caminho :
A pathname that contains at least one non-slash character and that ends with one or more trailing slashes shall be resolved as if a single dot character (
.
) were appended to the pathname.
Em outras palavras, foo/
é equivalente a foo/.
.
O POSIX não permite, ou mesmo permite, que a expansão do nome do caminho adicione uma barra aos links simbólicos. Isso é algo que alguns shells fazem quando definem opções não padrão. Eu não sei se o bash tem uma opção para isso. Em ksh, é set -o markdirs
. O Zsh também possui essa opção, mas afeta somente diretórios, e não links simbólicos para diretórios.
Existem outros casos em que uma barra final terminaria naturalmente no final de um parâmetro. Com um glob que termina com uma barra, o glob corresponde apenas a diretórios e links simbólicos para diretórios, e a expansão de nome de arquivo mantém a barra final. Portanto, mv a*/ /somewhere
move todos os subdiretórios do diretório atual cujo nome começa com a
e todos os destinos de links simbólicos no diretório atual, de forma que o link simbólico comece com a
e o destino seja um diretório. Outro caso está em conclusão; Não vou entrar em detalhes porque o bash e o zsh têm tantas opções de conclusão, mas dependendo das opções pode ser bastante fácil acabar com foo/
quando completar foo
e foo
é um link simbólico para um diretório.