Удалить символическую ссылку на каталог

1085

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

Я пытался rmи вернуться rm: cannot remove 'foo'.
Я попытался rmdirи вернулся, rmdir: failed to remove 'foo': Directory not empty
я прогрессировал rm -f, rm -rfиsudo rm -rf

Затем я пошел, чтобы найти свои резервные копии.

Есть ли способ избавиться от символической ссылки, не выбрасывая ребенка с водой?

Мэтью Скотен
источник
74
что не так с заданием вопросов, связанных с Linux? в прошлый раз, когда я проверял, переполнение стека не было специфичным для
ОС
6
Разве этот вопрос не лучше подходит Super User или Stack Exchange, связанному с Linux?
mwfearnley
45
@mwfearnley Было бы, но проверь дату. Супер-пользователь тогда еще не был чем-то особенным. Это было перенесено, так что это тоже там. Не уверен, почему это все еще здесь, но это мой самый высокий вопрос, и я не собираюсь смотреть подарочную карму в рот.
Мэтью Скоутен,
16
СОВЕТ: rm -r link/ удаляет содержимое на цели
Gayan Weerakutti
31
Then I went to find my back-ups- Это заставило меня посмеяться.
frakman1

Ответы:

1309
# this works:
rm foo
# versus this, which doesn't:
rm foo/

По сути, вы должны сказать ему, чтобы удалить файл , а не удалить каталог . Я полагаю, что разница между rmи rmdirсуществует из-за различий в том, как библиотека C относится к каждому.

Во всяком случае, первое должно работать, а второе должно жаловаться на то, что foo является каталогом.

Если это не работает, как указано выше, проверьте свои разрешения. Для удаления файлов вам нужно разрешение на запись в содержащий каталог.

Мэтью Шарли
источник
122
о да. в этом есть смысл. Я никогда не вводил foo, я набирал f <tab> и bash заполнял / для меня.
Мэтью Скотен
6
Это не всегда работает. Иногда вам нужно запустить rm -rf folderName(без трейлинга /), чтобы удалить символическую ссылку. Amazon Linux ведет себя таким образом при определенных обстоятельствах, например.
brandonscript
18
@ r3mus: Никогда не используйте -rсимволическую ссылку, если вы не хотите потерять все внутри нее. -fтакже не нужно, за исключением, возможно, переопределения прав доступа к файлам.
Мэтью Шарли
27
В частности, не unlinkимеет никакого отношения к lnоперации «ссылка» AKA. Имя unlinkотносится к процессу удаления / удаления файла из таблицы файлов файловой системы, так что содержимое становится отделенным от любой ссылки на них - они не связаны. Это запутанное имя, которое вводит в заблуждение, в частности, применительно к ссылкам и символическим ссылкам. unlinkбудет работать с символическими ссылками, потому что он работает с любым файлом независимо от его типа.
Мэтью Шарли
4
Если вы когда-либо действительно беспокоились о том, чтобы сделать что-то глупое, alias rm="rm -i"я думаю , вы сэкономили больше шкур, чем всего остального.
Мэтью Шарли
832

используйте команду "unlink" и убедитесь, что не иметь / в конце

$ unlink mySymLink

unlink () удаляет имя из файловой системы. Если это имя было последней ссылкой на файл, и файл не был открыт ни у одного процесса, файл удаляется, а используемое им пространство становится доступным для повторного использования. Если имя было последней ссылкой на файл, но файл был открыт во всех процессах, файл будет существовать до тех пор, пока последний дескриптор файла, ссылающийся на него, не будет закрыт.

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

Если имя ссылается на символическую ссылку, ссылка удаляется.

Если имя относится к сокету, fifo или устройству, имя для него удаляется, но процессы, у которых открыт объект, могут продолжать его использовать.

https://linux.die.net/man/2/unlink

Джо Филлипс
источник
33
@OmarAbid Версия "rm foo /" пугает меня. Этот кажется намного безопаснее :)
Джо Филлипс
9
В Ubuntu, я тестировал с ~/c/a/file, /c/b/с ln -s ~/c/a ~/c/b/. В ~/c/b/, rm a/не работает, rm -rf a/только пустой оригинал a. unlink aработает отлично, и unlink a/ничего не делает.
Брейди Трейнор
3
В OS X 10.10 unlinkэто просто псевдоним для rm. Это показывает, что rmпри работе с любой частью вашей структуры каталогов следует использовать надлежащую дисциплину.
Дуг Пауэрс,
1
В сценариях rm -fбудет молча удалить ссылку, независимо от того, существует она или нет, а unlinkбудет жаловаться, если ссылка отсутствует. Не существует опции `-f ', эквивалентной unlink, что делает скрипт более сложным.
пользователь shonky linux
22
unlinkМожно удалить обычные файлы. это менее характерно, чем rmи не характерно для символических ссылок. rmтакже не удаляет каталоги без -rфлага. Поэтому я рекомендую выбрать rm, у него есть флаги для подробного и интерактивного; а также значимые предупреждения и сообщения об ошибках.
ThorSummoner
18

rm должен удалить символическую ссылку.

skrall@skrall-desktop:~$ mkdir bar
skrall@skrall-desktop:~$ ln -s bar foo
skrall@skrall-desktop:~$ ls -l foo
lrwxrwxrwx 1 skrall skrall 3 2008-10-16 16:22 foo -> bar
skrall@skrall-desktop:~$ rm foo
skrall@skrall-desktop:~$ ls -l foo
ls: cannot access foo: No such file or directory
skrall@skrall-desktop:~$ ls -l bar
total 0
skrall@skrall-desktop:~$ 
Стив К
источник
17

Используйте, rm symlinknameно не включайте косую черту в конце (не используйте :) rm symlinkname/. Затем вас спросят, хотите ли вы удалить символическую ссылку, yчтобы ответить «да».

DeeEss09
источник
63
Вы не ошиблись, но правильный ответ уже здесь и принят (4 года назад!). Зачем беспокоиться?
Мэтью Скотен
1
Google использовал это как рекомендуемый фрагмент при поиске «Удалить символическую ссылку». Может быть, ему понравилась краткость, не уверенная, как работает его эвристика. Во всяком случае, я быстро сделал маску, когда оглянулся на свою командную строку :-)
Рэндалл
12

Предполагая, что это на самом деле символическая ссылка,

$ rm -d symlink

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

Джошуа
источник
7

Если rm не может удалить символическую ссылку, возможно, вам нужно посмотреть разрешения для каталога, который содержит символическую ссылку. Чтобы удалить записи каталога, вам нужно разрешение на запись в каталог, содержащий.

Грег Хьюгилл
источник
4

Предполагая, что ваши настройки похожи на:, ln -s /mnt/bar ~/fooтогда вы сможете сделать это rm fooбез проблем. Если вы не можете, убедитесь, что вы являетесь владельцем fooи имеете разрешение на запись / выполнение файла. Удаление fooне коснется bar, если вы не сделаете это рекурсивно.

TJ L
источник
2

На CentOS просто запустите rm linknameи он попросит «удалить символическую ссылку?». Введите Yи Enterссылка исчезнет, ​​и каталог будет в безопасности.

Юрий
источник
2

У меня была эта проблема с MinGW (фактически Git Bash), работающим на Windows Server. Ни одно из приведенных выше предложений не сработало. В конце концов сделал копию каталога на тот случай, затем удалил программную ссылку в Windows Explorer, затем удалил элемент в Корзине. Он издавал шумы, как будто удалял файлы, но не делал этого. Сделайте резервную копию, хотя!

Кит Уиттингем
источник
3
«Он издавал шумы, как будто удалял файлы ...» - Ух ты!
Sterex
LMFAO. «Он издавал шумы, как будто удалял файлы ...»
Шивам Джа,
Я помню дискеты!
Кит Уиттингем
Ничто из вышеперечисленного не сработало для меня: eddyq @ eddyq-Latitude-E6440: ~ $ ls Загрузка с рабочего стола Dropbox-Windows Музыка Общедоступные видео w Документы Dropbox examples.desktop Шаблоны изображений 'VmWare vmx files'
eddyq