символическая ссылка на уже существующий каталог

символическая ссылка на уже существующий каталог

Есть ли правильный способ сделать ссылку /home/user/app/publicна /home/user/public_html, учитывая тот факт, что цель уже существует?

Если я это сделаю ln -s /home/user/app/public /home/user/public_html, то в итоге получу /home/user/public_html/public.

Я думаю, что можно было бы также инвертировать действие, например ln -s /home/user/public_html /home/user/app/public, , однако я не уверен, как этого избежать /home/user/app/public/public_htmlв конечном итоге.

решение1

Позвольте мне правильно понять вашу проблему.

Ваш источник /home/user/public_htmlи я предполагаю, что там есть файлы. И вы хотите сделать ссылку на этот каталог прямо в /home/user/app/public. Таким образом, вы могли бы сделать что-то вроде ls /home/user/app/publicи увидеть файлы, которые существуют в /home/user/public_html.

Если это верно, то ваш источник — /home/user/public_html, а цель — /home/user/app/public. Правильная команда — эта:

ln -s /home/user/public_html /home/user/app/public

Просто убедитесь, что /home/user/app/publicэто не допустимый каталог или файл, прежде чем вводить команду.

решение2

Если я правильно понял ваш вопрос, вы хотели узнать, как бороться с уже существующими целями. Если это так, то есть два возможных сценария.

1) существующая цель — файл. Если это так, вы можете принудительно создать символическую ссылку с помощью "-f"

2) существующая цель — это каталог. Если это так, то это зависит от вашей текущей реализации команды ln. Этомогиметь доступный аргумент «-n», который позволяет правильно обрабатывать символические ссылки на каталоги, а не дублировать их, как вы говорите.

Ссылка:https://unix.stackexchange.com/questions/207294/create-symlink-overwrite-if-one-exists

решение3

Я не собираюсь вдаваться в подробное обсуждение этого вопроса, поскольку правильный ответ уже выбран, но он lnпросто не работает таким образом.

Альтернативным решением было бы использовать mountвместо ln. Я считаю, что правильная команда в этом случае будет:

sudo mount --bind ~/app/public ~/public_html

Однако обратите внимание на предостережение относительно такого способа: по моему опыту, mountтребует привилегий, поэтому вам придется sudoэто сделать. По этой причине вы не можете поместить его, .profileтак как это заблокирует ваш сеанс. Вы можете поместить его в скрипт или добавить его в /etc/fstab. Я обычно не добавляю привязанные монтирования в fstab, но я думаю, что запись будет такой:

/home/user/app/public /home/user/public_html none defaults,bind 0 0

или что-то очень похожее. Я также почти уверен, что вы не можете использовать относительные пути в fstab, поэтому пути должны быть абсолютными, как я показал здесь.

решение4

Как отмечают в комментариях @jotadepicas и @Milkmannetje, есть несколько способов справиться с этой проблемой.

Предположим, что ваш источник — $source, а пункт назначения — $target.

  1. Сначала вручную удалите цель. Это должно работать на Linux и Mac одинаково.

    rm "$target"
    ln -s "$source" "$target"
    
  2. Если вы используете Linux, вы можете воспользоваться этой -Tопцией.

    ln -sT "$source" "$target"
    
  3. Если вы используете macOS, вы можете воспользоваться этой -Fопцией.

    ln -sF "$source" "$target"
    

Связанный контент