Linux / Comando ln: criar links físicos e simbólicos
ln cria um link físico, outro nome para o mesmo arquivo, por padrão; com -s, cria um link simbólico que guarda um caminho. Use o link físico para compartilhar o mesmo arquivo no mesmo sistema de arquivos, e o simbólico para apontar para uma pasta, outro sistema de arquivos ou um caminho ainda inexistente. A ordem básica é alvo primeiro, nome do link depois.
Os exemplos usam Bash e GNU Coreutils. Confira ln --version, ln --help e man ln no destino; opções como -r e -T podem faltar em outras implementações. Prepare a área exclusiva abaixo e mantenha o mesmo terminal durante a prática. Não é necessário alterar uma instalação real em /opt ou /srv.
O que é o comando ln?
No Linux, inode é a estrutura que identifica um arquivo e seus metadados dentro de um sistema de arquivos. Dois links físicos (hard links) compartilham esse inode; nenhum dos nomes é mais original que o outro. Apagar um nome não destrói os dados enquanto outro link físico permanece. Já o link simbólico, ou symlink, é um objeto separado que guarda texto: se esse caminho deixar de resolver, o link fica pendente, também chamado de quebrado. O manual Linux de links simbólicos descreve essas diferenças.
Sintaxe básica
ln [opções] [-T] alvo nome-do-link
ln [opções] alvo ... diretório
alvo, nome-do-link e diretório são marcadores. Use aspas em caminhos com espaços e -- antes dos nomes no GNU. Normalmente, o nome novo não deve existir; sem uma opção de substituição, ln falha ao encontrar esse nome. Com vários alvos, a pasta receptora precisa existir.
Uso básico do ln
Criar um link físico
Execute o bloco inteiro: ele guarda a pasta inicial, cria uma área exclusiva, prepara os arquivos e gera o link físico. Os passos com && só continuam após sucesso; pare se a preparação falhar. No resultado de stat, as duas linhas devem ter o mesmo identificador de dispositivo (%d) e inode (%i), e a contagem de links (%h) será 2 nessa área nova. %n mostra o nome consultado.
ln_start=$PWD
ln_demo=$(mktemp -d "${TMPDIR:-/tmp}/ln-demo.XXXXXX") &&
cd -- "$ln_demo" &&
mkdir -p -- releases/v1 releases/v2 app links links-t &&
printf '%s\n' 'conteúdo original' > original.txt &&
printf '%s\n' 'arquivo 1' > file1 &&
printf '%s\n' 'arquivo 2' > file2 &&
printf '%s\n' 'versão 1' > releases/v1/version.txt &&
printf '%s\n' 'versão 2' > releases/v2/version.txt &&
ln -s -- releases/v1 current &&
ln -- original.txt hard-link.txt &&
stat -c '%d %i %h %n' -- original.txt hard-link.txt
Uma gravação no arquivo aberto por qualquer desses nomes altera os mesmos bytes. Por exemplo, na prática, printf '%s\n' 'linha adicional' >> hard-link.txt também aparece ao ler original.txt. Um editor que salva substituindo o arquivo por outro inode pode separar essa relação; não confunda isso com uma cópia independente.
Criar um link simbólico
A pasta releases/v1 já existe na área preparada. O primeiro argumento abaixo é um caminho absoluto calculado a partir de ln_demo; esse texto fica guardado em app-current. Um link simbólico também pode ser criado antes de seu alvo existir, mas isso não significa que ele já possa ser aberto.
ln -s -- "$ln_demo/releases/v1" app-current &&
readlink -- app-current
Criar vários links em uma pasta
As duas linhas usam pastas diferentes, links e links-t, para não disputar os mesmos nomes. Cada uma terá file1 e file2 como links. Os textos ../file1 e ../file2 são relativos à pasta de cada link, apontando para os arquivos na raiz da prática. Eles não são avaliados a partir do terminal para decidir o conteúdo do link.
ln -s -- ../file1 ../file2 links/
ln -s -t links-t -- ../file1 ../file2
Ler o caminho guardado no link
Uma criação bem-sucedida normalmente é silenciosa. O comando readlink mostra o texto guardado, sem comprovar que o destino existe. Este exemplo usa um arquivo novo para não sobrescrever original.txt, que já tem um link físico:
printf 'demo\n' > demo-target.txt &&
ln -s -- demo-target.txt shortcut.txt &&
readlink -- shortcut.txt
A saída esperada é demo-target.txt. A pasta que contém shortcut.txt é a base desse caminho relativo. Mover só o link para outra pasta pode quebrá-lo; mover a árvore inteira mantendo a relação entre alvo e link pode preservar seu funcionamento. Para exigir resolução completa de um destino existente, use readlink -e e confira o status.
Opções principais
| Opção | Propósito |
|---|---|
-s |
Criar links simbólicos em vez de links físicos. |
-r |
Calcular um alvo relativo à localização do link; usar com -s. |
-f |
Substituir um destino existente, que também pode ser um arquivo regular. |
-i |
Pedir confirmação antes de substituir um destino existente. |
-n |
Tratar o último operando que é link para uma pasta como o próprio link. |
-T |
Usar o último argumento como nome exato, sem colocar outro link dentro de uma pasta. |
-b |
Guardar uma versão do destino que seria substituído. |
-v |
Mostrar o nome de cada link depois de criá-lo com sucesso. |
-n no ln não significa “não sobrescrever”, como em alguns outros comandos: ele altera o tratamento de um link de destino que aponta para uma pasta. -T é mais forte e torna -n redundante quando ambos aparecem. Sem essas opções, um destino que é link para pasta pode receber um novo link dentro da pasta apontada. -T não autoriza substituir uma pasta real. Essas regras estão no manual GNU de ln.
Exemplos práticos
Criar um link simbólico relativo
Na primeira linha, o texto ../releases/v1 é calculado a partir de app, a pasta que contém app/current. Na segunda, ln -sr calcula o caminho para outro nome, app/current-auto, sem reutilizar o link anterior. O GNU calcula esse caminho a partir dos diretórios e alvos canonicalizados, resolvendo links intermediários; o resultado pode apontar para a localização física resolvida, em vez de preservar um nome intermediário que você pretendia acompanhar.
ln -s -- ../releases/v1 app/current
ln -sr -- "$ln_demo/releases/v1" "$ln_demo/app/current-auto"
Trocar somente um link existente
-f também pode descartar um arquivo regular no nome do destino. Para a prática, salve o script completo abaixo como switch-link.sh e execute bash switch-link.sh "$ln_demo/releases/v2" "$ln_demo/current". Ele requer Bash e GNU ln e readlink, exige que o alvo seja uma pasta acessível e que o caminho a substituir já seja um link simbólico. A preparação criou current apontando para releases/v1.
#!/usr/bin/env bash
if [ "$#" -ne 2 ]; then
printf '%s\n' 'Uso: bash switch-link.sh PASTA_ALVO LINK_EXISTENTE' >&2
exit 2
fi
target_dir=$1
link_name=$2
if [ ! -d "$target_dir" ] || [ ! -L "$link_name" ]; then
printf '%s\n' 'Exige uma pasta alvo e um link simbólico existente.' >&2
exit 1
fi
printf '%s\n' 'Antes:'
readlink -- "$link_name" || exit 1
ln -sfrT -- "$target_dir" "$link_name" || exit 1
if ! test "$link_name" -ef "$target_dir"; then
printf '%s\n' 'O link não resolveu para a pasta esperada.' >&2
exit 1
fi
printf '%s\n' 'Depois:'
readlink -- "$link_name" || exit 1
O script mostra o texto anterior e o novo, usa -r para calcular o alvo relativo e -T para nomear o link exato. Na área preparada, a nova saída será releases/v2; ao ler current/version.txt, você verá versão 2. Uso incorreto retorna 2; falha ou recusa de tipo retorna 1. test -ef verifica se os dois caminhos resolvem para o mesmo arquivo. As verificações não bloqueiam alterações concorrentes: use uma pasta sob seu controle. Trocar o link não torna toda a implantação de uma aplicação uma transação nem valida o serviço.
Inspecionar o link e o destino
O exemplo abaixo inspeciona app-current, que continua apontando para a versão 1, independentemente da troca de current. ls -ld mostra a entrada do link; readlink mostra seu texto e readlink -e exige o caminho final existente. Por padrão, o GNU stat informa sobre o próprio link; com -L, informa sobre o alvo. Os campos %F e %N mostram tipo e nome, com representação de link conforme o caso. Veja também o guia de stat.
ls -ld -- app-current
readlink -- app-current
readlink -e -- app-current
stat -c '%F %N' -- app-current
stat -L -c '%F %N' -- app-current
Comparar links e alternativas
| Comando ou método | Função principal | Quando usar |
|---|---|---|
| Link físico (hard link) | Outro nome para um inode | Compartilhar um arquivo regular no mesmo sistema de arquivos |
| Link simbólico | Um arquivo separado armazenando um caminho de destino | Apontar para pastas, outros sistemas de arquivos ou caminhos de versão |
cp |
Uma cópia de dados independente | Mudar os dados da cópia sem alterar o original |
| Montagem vinculada | Expor um caminho em outro ponto de montagem | Expor um caminho por outra montagem no Linux; exige configuração e permissões próprias |
Um link físico não é um backup independente: escrever pelos dois nomes modifica o mesmo arquivo. Se o objetivo for manter versões de conteúdo separadas, use uma cópia com cp. Uma montagem vinculada (bind mount) é outro mecanismo, que expõe uma árvore em outro ponto de montagem; não é um link simbólico criado por ln -s.
Cuidados importantes
Lembre-se da ordem dos operandos
A forma comum é ln alvo nome-do-link. O primeiro caminho indica o arquivo compartilhado, no link físico, ou o texto a guardar, no simbólico. O segundo indica onde criar o nome. Confira ambos antes de acrescentar -f; sem substituição explícita, um nome existente é motivo para examinar o erro, não para forçar automaticamente.
Alvos relativos são baseados na localização do link
Um texto relativo que funciona a partir do terminal pode apontar para outro lugar quando guardado em um link dentro de outra pasta. Calcule-o a partir da pasta que conterá o link, ou use ln -sr sabendo que ele resolve caminhos intermediários. Um link absoluto mantém seu texto ao ser movido, mas pode apontar para outro objeto se o mesmo caminho absoluto tiver significado diferente em outra máquina ou raiz de arquivos.
Links físicos ficam no mesmo sistema de arquivos
No Linux, links físicos compartilham o inode no mesmo sistema de arquivos e não podem atravessar essa fronteira. Não tente criar um link físico de diretório para simular uma árvore: essa operação é normalmente proibida. Links simbólicos podem atravessar sistemas de arquivos, mas o acesso ao destino continua dependendo das permissões de seus componentes. Para voltar à pasta inicial ao fim da prática, use cd -- "$ln_start"; os arquivos de teste permanecem disponíveis.
Perguntas frequentes
O comando ln cria um link simbólico por padrão?
Não. Ele cria um link físico, a menos que -s seja usado.
Excluir o nome original destrói um arquivo com link físico?
Não. Os dados permanecem enquanto outro link físico se refere ao inode.
Como detectar um link simbólico quebrado?
readlink lê o texto mesmo quando o destino não existe. test -L caminho identifica um link, enquanto test -e caminho testa a existência seguindo o destino. Um link com -L verdadeiro e -e falso não resolveu para um objeto acessível: o alvo pode faltar, mas permissões ou um ciclo também podem causar falha. Confira os diagnósticos de readlink -ev antes de concluir que houve exclusão.
Um link simbólico deve usar um destino absoluto ou relativo?
Links relativos são adequados para árvores de diretórios móveis; links absolutos são adequados para caminhos de sistema fixos. Escolha com base em como o link e o destino irão se mover.




