Utwórz dowiązanie symboliczne - zastąp, jeśli takie istnieje

54

Chcę usunąć dane /path/to/data/folder/month/date/hour/minute/filei /path/to/recent/fileutworzyć dowiązanie symboliczne i zrobić to automatycznie przy każdym utworzeniu pliku.

Zakładając, że nie będę wiedział z góry, czy /path/to/recent/fileistnieje, jak mogę go utworzyć (jeśli nie istnieje) lub zastąpić (jeśli istnieje)? Jestem pewien, że mogę po prostu sprawdzić, czy istnieje, a następnie wykonać usuwanie, dowiązanie symboliczne, ale zastanawiam się, czy istnieje proste polecenie, które zrobi to, co chcę w jednym kroku.

drjrm3
źródło
Jeśli cel istnieje, ale nie jest dowiązaniem symbolicznym, co chcesz / chcesz się wydarzyć?
Toby Speight

Odpowiedzi:

34

Proszę przeczytać instrukcję .

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

$ man ln

-n, - brak dereferencji
traktuj LINK_NAME jak zwykły plik, jeśli jest to dowiązanie symboliczne do katalogu

LithiumSix
źródło
1
Dlaczego to poprawna odpowiedź?
Mrchief
1
@Mrchief Jeśli /path/to/symlinkjest już dowiązaniem symbolicznym do katalogu, bez -nflagi, otrzymasz /path/to/symlink/targetzamiast niego dowiązanie symboliczne/path/to/symlink
Flimm
Zauważ, że w macOS nadal nie działa w niektórych przypadkach, na przykład, gdy /path/to/symlinkistnieje i jest katalogiem, ale nie dowiązaniem symbolicznym. Myślę, że jedynym sposobem obejścia tego jest uruchomienie w rm -rfpierwszej kolejności.
Flimm
78

To jest cel ln„s -fopcji: usuwa istniejące pliki docelowe, jeśli w ogóle, przed utworzeniem łącza.

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

utworzy dowiązanie symboliczne /path/to/recent/filewskazujące /path/to/data/folder/month/date/hour/minute/file, zastępując dowolny istniejący plik lub dowiązanie symboliczne do pliku, jeśli to konieczne (i działa dobrze, jeśli już tam nic nie ma)

Jeśli katalog lub dowiązanie symboliczne do katalogu już istnieje z nazwą docelową, dowiązanie symboliczne zostanie utworzone w nim (tak byś znalazł się /path/to/recent/file/filew powyższym przykładzie). -nOpcja dostępna w niektórych wersjach ln, zajmie dowiązania do katalogów dla ciebie, zastępując je w miarę potrzeby:

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

POSIXln nie określa, -nwięc ogólnie nie można na nim polegać. Wiele lnzachowań jest zdefiniowanych w implementacji, więc naprawdę musisz sprawdzić specyfikę używanego systemu. Jeśli używasz GNUln , możesz również użyć opcji -ti -T, aby jego zachowanie było w pełni przewidywalne w obecności katalogów ( tzn. Nie powiodło się zamiast tworzenia łącza w istniejącym katalogu o tej samej nazwie).

Stephen Kitt
źródło