Удалить символическую ссылку на каталог - PullRequest
1030 голосов
/ 17 октября 2008

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

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

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

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

Ответы [ 9 ]

1252 голосов
/ 17 октября 2008
# this works
rm foo
# versus
rm foo/

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

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

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

818 голосов
/ 17 октября 2008

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

$ unlink mySymLink

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

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

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

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

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

17 голосов
/ 17 октября 2008

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:~$ 
15 голосов
/ 22 августа 2012

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

12 голосов
/ 17 октября 2008

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

$ rm -d symlink

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

7 голосов
/ 17 октября 2008

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

4 голосов
/ 17 октября 2008

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

2 голосов
/ 30 января 2018

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

2 голосов
/ 17 сентября 2014

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

...