Criar link simbólico - sobrescreva se houver

54

Quero anotar os dados, /path/to/data/folder/month/date/hour/minute/filevinculá-los /path/to/recent/filee fazer isso automaticamente sempre que um arquivo for criado.

Supondo que não saberei antecipadamente se /path/to/recent/fileexiste, como posso criá-lo (se não existir) ou substituí-lo (se existir)? Tenho certeza de que posso apenas verificar se existe e, em seguida, fazer uma exclusão, link simbólico, mas estou me perguntando se existe um comando simples que faça o que eu quero em uma única etapa.

drjrm3
fonte
Se o destino existe, mas não é um link simbólico, o que você deseja / espera que aconteça?
Toby Speight

Respostas:

34

Por favor, leia o manual .

ln -sfn /new/target /path/to/symlink

$ man ln

-n, --no-dereference
trata LINK_NAME como um arquivo normal se for um link simbólico para um diretório

LithiumSix
fonte
11
Por que essa é a resposta correta?
Mrchief
11
@Mrchief Se /path/to/symlinkjá é um link simbólico para um diretório, sem a -nbandeira, você vai ter o link simbólico criado em /path/to/symlink/targetvez de substituir/path/to/symlink
Flimm
Observe que, no macOS, isso ainda não funciona em alguns casos, por exemplo, quando /path/to/symlinkexiste e é um diretório, mas não um link simbólico. Eu acho que a única maneira de contornar isso é correr rm -rfprimeiro.
Flimm
78

Este é o propósito do ln's -fopção: ele remove arquivos de destino existentes, se houver, antes de criar o link.

ln -sf /path/to/data/folder/month/date/hour/minute/file /path/to/recent/file

criará o link simbólico /path/to/recent/fileapontando para /path/to/data/folder/month/date/hour/minute/file, substituindo qualquer arquivo existente ou link simbólico para um arquivo, se necessário (e funcionando bem, se já não existir nada).

Se um diretório ou link simbólico para um diretório já existir com o nome do destino, o link simbólico será criado dentro dele (para que você acabe /path/to/recent/file/fileno exemplo acima). A -nopção, disponível em algumas versões do ln, cuidará dos links simbólicos para os diretórios, substituindo-os conforme necessário:

ln -sfn /path/to/data/folder/month/date/hour/minute/file /path/to/recent/file

O POSIXln não especifica, -nportanto você não pode confiar nele em geral. Grande parte do lncomportamento é definido pela implementação, então você realmente precisa verificar as especificidades do sistema que está usando. Se você estiver usando o GNUln , também poderá usar as opções -te -T, para tornar seu comportamento totalmente previsível na presença de diretórios ( ou seja, falhar em vez de criar o link dentro do diretório existente com o mesmo nome).

Stephen Kitt
fonte