Como faço para excluir o destino de um link simbólico sem excluir o próprio link?

10

Eu tenho um link simbólico ~/Desktop/test.txtque aponta para ~/rendu/test.txt.

Eu sei SOMENTE o caminho de ~/Desktop/test.txt, eu quero uma maneira rápida de excluir ~/rendu/test.txtSEM excluir o link simbólico.

Para quem quer saber o porquê: tenho um arquivo nomeado crypted.xxxna minha área de trabalho, criptografado e contém minha senha.

Quando eu quero atualizar meu arquivo criptografado, eu o decodifico e ele é criado crypted.txtem um diretório especial. Então, faço um link para esse arquivo na minha área de trabalho por motivos práticos. Mas depois de olhar para o meu crypted.txt, quero excluir rapidamente isso crypted.txt(mas não o link na área de trabalho).

Ugo Hed
fonte
4
espere, você quiser excluir o arquivo (como a sua pergunta sugere) ou apagar o conteúdo do arquivo (como o sais título)
Jacob Vlijm
Excluir o arquivo e manter a ligação simbólica, pena de mal-entendido
Ugo Hed
2
Talvez você considere usar um gerenciador de senhas dedicado? Keepass é muito bom, por exemplo, e está nos repositórios.
precisa saber é

Respostas:

11

usando findpara encontrar o link simbólico e, em seguida, usando readlinkpara obter o caminho completo para o destino rm:

find ~/Desktop/ -type l -name 'test.txt' -exec bash -c 'rm "$(readlink -f "$1")"' _ {} \;

Ou como você já sabe o nome do link:

rm "$(readlink -f ~/Desktop/test.txt)"
heemail
fonte
4
Tenha cuidado com os links relativos. Um link simbólico relativo é interpretado como relativo ao diretório em que está localizado. Mas seu rmcomando o interpretará como relativo ao diretório atual do shell. Portanto, existe a possibilidade desse comando excluir um arquivo diferente daquele para o qual o link simbólico estava apontando.
kasperd
5
@kasperd Com -f -eou -mo caminho completo é retornado, mesmo que o link simbólico de destino aponte para um caminho relativo, então sim, isso é uma preocupação no caso de rm "$(readlink ~/Desktop/test.txt)", mas não ao usar -f -eou -m.
kos
@ kos Você está certo. Nesse caso, você só precisa se preocupar se houver condições de corrida.
kasperd
Como alternativa, pode-se usar o caminho real , que nesse caso faz a mesma coisa que readlink -f(mas também funciona se o próprio destino não for um link).
precisa saber é o seguinte
6

Basta usar:

printf "" > "$(readlink '/path/to/link')"

para limpar o arquivo ou

rm "$(readlink '/path/to/link')"

para remover o arquivo

Jacob Vlijm
fonte