Comment supprimer la cible d'un lien symbolique sans supprimer le lien lui-même?

10

J'ai un lien symbolique ~/Desktop/test.txtqui pointe vers ~/rendu/test.txt.

Je connais UNIQUEMENT le chemin de ~/Desktop/test.txt, je veux un moyen rapide de supprimer ~/rendu/test.txtSANS supprimer le lien symbolique.

Pour celui qui veut savoir pourquoi: J'ai un fichier nommé crypted.xxxsur mon bureau, qui est crypté et contient mon mot de passe.

Lorsque je veux mettre à jour mon fichier crypté, je le décrypte et le crée crypted.txtdans un répertoire spécial. Je fais donc un lien vers ce fichier sur mon bureau pour des raisons pratiques. Mais après avoir regardé mon crypted.txt, je veux le supprimer rapidement crypted.txt(mais pas le lien sur le bureau).

Ugo Hed
la source
4
attendez, vous voulez supprimer le fichier (comme votre question le suggère) ou supprimer le contenu du fichier (comme le titre le dit)
Jacob Vlijm
Supprimez le fichier et conservez le lien symbolique, désolé pour les malentendus
Ugo Hed
2
Vous pourriez peut-être envisager d'utiliser un gestionnaire de mots de passe dédié à la place? Keepass est assez bon, par exemple, et est dans les dépôts.
evilsoup

Réponses:

11

en utilisant findpour trouver le lien symbolique puis en utilisant readlinkpour obtenir le chemin complet vers la cible pour rm:

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

Ou comme vous connaissez déjà le nom du lien:

rm "$(readlink -f ~/Desktop/test.txt)"
heemayl
la source
4
Attention cependant aux liens relatifs. Un lien symbolique relatif est interprété comme relatif au répertoire dans lequel il se trouve. Mais votre rmcommande l'interprétera comme relatif au répertoire courant du shell. Il existe donc une possibilité pour cette commande de supprimer un fichier différent de celui vers lequel pointait le lien symbolique.
kasperd
5
@kasperd Avec -f -eou -mle chemin complet est retourné, même si le lien symbolique cible pointe vers un chemin relatif, donc oui, c'est une préoccupation dans le cas de rm "$(readlink ~/Desktop/test.txt)", mais pas lors de l'utilisation de -f -eou -m.
kos
@kos Vous avez raison. Dans ce cas, vous n'avez à vous inquiéter que s'il peut y avoir des conditions de course.
kasperd
Alternativement, on peut utiliser realpath , qui fait dans ce cas la même chose que readlink -f(mais fonctionne également si la cible elle-même n'est pas un lien).
leftaroundabout
6

Utilisez simplement:

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

pour effacer le fichier, ou

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

pour supprimer le fichier.

Jacob Vlijm
la source