Создать символическую ссылку - перезаписать, если она существует

54

Я хочу записать данные /path/to/data/folder/month/date/hour/minute/fileи сделать ссылку на них /path/to/recent/fileи делать это автоматически каждый раз, когда создается файл.

Предполагая, что я не буду знать заранее, если /path/to/recent/fileсуществует, как я могу создать его (если он не существует) или заменить (если он существует)? Я уверен, что могу просто проверить, существует ли он, а затем выполнить удаление, символическую ссылку, но мне интересно, есть ли простая команда, которая сделает то, что я хочу, за один шаг.

drjrm3
источник
Если пункт назначения существует, но не является символической ссылкой, что вы хотите / ожидаете?
Тоби Спейт

Ответы:

34

Пожалуйста, прочитайте руководство .

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

$ man ln

-n, --no-
dereference обрабатывать LINK_NAME как обычный файл, если это символическая ссылка на каталог

LithiumSix
источник
1
Почему это правильный ответ?
Mrchief
1
@Mrchief Если /path/to/symlinkуже есть символическая ссылка на каталог без -nфлага, /path/to/symlink/targetвместо замены вы получите символическую ссылку/path/to/symlink
Flimm
Обратите внимание, что в macOS это все еще не работает в некоторых случаях, например, когда /path/to/symlinkсуществует и является каталогом, но не символической ссылкой. Я думаю, что единственный способ обойти это - бежать rm -rfпервым.
Flimm
78

Это является целью параметра ln's' -f: он удаляет существующие файлы назначения, если таковые имеются, перед созданием ссылки.

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

создаст символическую ссылку, /path/to/recent/fileуказывающую на /path/to/data/folder/month/date/hour/minute/file, заменяя любой существующий файл или символическую ссылку на файл, если это необходимо (и работает нормально, если там уже ничего не существует).

Если каталог или символическая ссылка на каталог уже существует с целевым именем, внутри него будет создана символическая ссылка (так что в итоге вы получите /path/to/recent/file/fileв приведенном выше примере). -nОпция, доступная в некоторых версиях ln, будет заботиться о симлинках справочников для вас, заменяя их по мере необходимости:

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

POSIXln не определяет, -nпоэтому вы не можете полагаться на это вообще. Большая часть lnповедения определяется реализацией, поэтому вам действительно необходимо проверить специфику системы, которую вы используете. Если вы используете GNUln , вы можете использовать -tи -Tварианты тоже, чтобы сделать его поведение полностью предсказуемо в присутствии каталогов ( т.е. не в состоянии, а не создавать ссылку внутри существующего каталога с тем же именем).

Стивен Китт
источник