Jak usunąć cel dowiązania symbolicznego bez usuwania samego łącza?

10

Mam symboliczny link, ~/Desktop/test.txtktóry wskazuje ~/rendu/test.txt.

Znam TYLKO ścieżkę ~/Desktop/test.txt, chcę szybkiego sposobu usunięcia ~/rendu/test.txtBEZ usuwania linku symbolicznego.

Dla tego, kto chce wiedzieć, dlaczego: Mam plik o nazwie crypted.xxxna pulpicie, który jest zaszyfrowany i zawiera moje hasło.

Kiedy chcę zaktualizować zaszyfrowany plik, odszyfrowuję go i tworzę crypted.txtw specjalnym katalogu. Dlatego ze względów praktycznych robię link do tego pliku na pulpicie. Ale po obejrzeniu mojego crypted.txt, chcę to szybko usunąć crypted.txt(ale nie link na pulpicie).

Ugo Hed
źródło
4
poczekaj, chcesz usunąć plik (jak sugeruje twoje pytanie) lub usunąć zawartość pliku (jak w tytule sais)
Jacob Vlijm
Usuń plik i zachowaj symboliczny link, przepraszamy za nieporozumienia
Ugo Hed,
2
Może zamiast tego możesz rozważyć użycie dedykowanego menedżera haseł? Keepass jest na przykład całkiem niezły i znajduje się w repozytorium.
evilsoup

Odpowiedzi:

11

za pomocą, findaby znaleźć dowiązanie symboliczne, a następnie za pomocą, readlinkaby uzyskać pełną ścieżkę do celu, aby rm:

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

Lub jak już znasz nazwę linku:

rm "$(readlink -f ~/Desktop/test.txt)"
heemayl
źródło
4
Uważaj jednak na linki względne. Względne dowiązanie symboliczne jest interpretowane jako odniesienie do katalogu, w którym się znajduje. Ale twoje rmpolecenie zinterpretuje to jako odniesienie do bieżącego katalogu powłoki. Dlatego istnieje możliwość, że to polecenie usunie inny plik niż ten, na który wskazywał dowiązanie symboliczne.
kasperd
5
@kasperd With -f -elub -mpełna ścieżka jest zwracana, nawet jeśli docelowy dowiązanie symboliczne wskazuje ścieżkę względną, więc tak, jest to problem w przypadku rm "$(readlink ~/Desktop/test.txt)", ale nie w przypadku użycia -f -elub -m.
Kos
@kos Masz rację. W takim przypadku musisz się tylko martwić, czy mogą wystąpić jakiekolwiek warunki wyścigu.
kasperd,
Alternatywnie można użyć realpath , co w tym przypadku robi to samo co readlink -f(ale działa również, jeśli sam cel nie jest linkiem).
lewo wokół około
6

Po prostu użyj:

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

aby wyczyścić plik, lub

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

aby usunąć plik.

Jacob Vlijm
źródło