
Есть ли правильный способ сделать ссылку /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
.
Сначала вручную удалите цель. Это должно работать на Linux и Mac одинаково.
rm "$target" ln -s "$source" "$target"
Если вы используете Linux, вы можете воспользоваться этой
-T
опцией.ln -sT "$source" "$target"
Если вы используете macOS, вы можете воспользоваться этой
-F
опцией.ln -sF "$source" "$target"