Как удалить цель символической ссылки, не удаляя саму ссылку?

10

У меня есть символическая ссылка, ~/Desktop/test.txtкоторая указывает на ~/rendu/test.txt.

Я знаю ТОЛЬКО путь ~/Desktop/test.txt, я хочу быстрый способ удалить ~/rendu/test.txtБЕЗ удаления символической ссылки.

Для того, кто хочет знать почему: у меня есть файл с именем crypted.xxxна моем рабочем столе, который зашифрован и содержит мой пароль.

Когда я хочу обновить зашифрованный файл, я дешифрую его и создаю crypted.txtв специальном каталоге. Поэтому я делаю ссылку на этот файл на своем рабочем столе по практическим соображениям. Но, посмотрев на мой crypted.txt, я хочу быстро удалить это crypted.txt(но не ссылку на рабочем столе).

Уго Хед
источник
4
подождите, вы хотите удалить файл (как предполагает ваш вопрос) или удалить содержимое файла (как и заголовок)
Jacob Vlijm
Удалите файл и сохраните символическую ссылку, извините за недоразумение
Ugo Hed
2
Может быть, вы могли бы вместо этого использовать выделенный менеджер паролей? Например, Keepass довольно хорош и находится в репозиториях.
evilsoup

Ответы:

11

используя, findчтобы найти символическую ссылку, а затем используя, readlinkчтобы получить полный путь к цели rm:

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

Или, как вы уже знаете название ссылки:

rm "$(readlink -f ~/Desktop/test.txt)"
heemayl
источник
4
Будьте осторожны с относительными ссылками, хотя. Относительная символическая ссылка интерпретируется как относящаяся к каталогу, в котором она находится. Но ваша rmкоманда будет интерпретировать ее как относительную к текущему каталогу оболочки. Следовательно, для этой команды есть возможность удалить файл, отличный от того, на который указывала символическая ссылка.
kasperd
5
@kasperd С -f -eили -mполный путь возвращается, даже если целевая символическая ссылка указывает на относительный путь, так что да, это важно в случае rm "$(readlink ~/Desktop/test.txt)", но не при использовании -f -eили -m.
Кос
@kos Вы правы. В этом случае вам нужно беспокоиться только о возможных условиях гонки.
kasperd
В качестве альтернативы можно использовать realpath , который в этом случае делает то же самое, что и readlink -f(но также работает, если сама цель не является ссылкой).
оставил около
6

Просто используйте:

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

чтобы очистить файл, или

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

чтобы удалить файл.

Якоб Влейм
источник