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


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чтобы ответить «да».


63
Вы не ошиблись, но правильный ответ уже здесь и принят (4 года назад!). Зачем беспокоиться?
Мэтью Скотен

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

12

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

$ rm -d symlink

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


7

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


4

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


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
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.