Видаліть символьне посилання до каталогу


1085

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

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

Потім я пішов шукати резервні копії.

Чи є спосіб позбутися симпосилання, викинувши дитину разом з водою?


74
Що не так у питанні питань, пов’язаних з Linux? востаннє я перевіряв, переповнення стека не було специфічним для ОС
Jeremy Cantrell

6
Хіба це питання не підходило б для Super User або біржі стека, пов’язаної з Linux?
mwfearnley

45
@mwfearnley Було б, але перевірити дату. Супер Користувач тоді ще не був річчю. Його перенесли, значить, він теж є. Не впевнений, чому це все ще тут, але це моє найвище оцінювальне запитання, і я не збираюсь шукати подарункову карму в рот.
Меттью Скаутен

16
Порада: rm -r link/ видаляє вміст у цілі
Gayan Weerakutti

31
Then I went to find my back-ups- Це змусило насміхатися.
frakman1

Відповіді:


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

В основному, потрібно сказати йому, щоб видалити файл , а не видалити каталог . Я вважаю, що різниця між rmі rmdirіснує через відмінності в поводженні бібліотеки С до кожної.

У будь-якому випадку, перший повинен працювати, а другий повинен скаржитися на те, що foo є каталогом.

Якщо це не працює, як описано вище, перевірте свої дозволи. Для видалення файлів потрібен дозвіл на написання у каталог, що містить


121
ах так. що має сенс. Я ніколи не набирав foo, я набирав f <tab> і баш заповнював а / для мене.
Меттью Скаутен

6
Це не завжди працює. Іноді вам потрібно запустити rm -rf folderName(без закінчення /), щоб видалити симпосилання. Наприклад, Amazon Linux поводиться таким чином за певних обставин.
фірмовий сценарій

18
@ r3mus: Ніколи не використовуйте -rсимвольне посилання, якщо ви не хочете втратити все, що знаходиться всередині нього. -fтакож не знадобиться, за винятком, можливо, змінити дозволи файлів.
Меттью Шарлі

27
Зокрема, unlinkне має жодного відношення до lnоперації AKA "зв'язку". Назва unlinkпосилається на процес від’єднання / видалення файлу з таблиці файлових файлів файлової системи, щоб вміст відірвався від будь-яких посилань на них - вони від’єднані. Це заплутане ім'я, яке прямо вводить в оману, коли застосовується, зокрема, до посилань та посилань. unlinkбуде працювати з посиланнями, тому що він працює з будь-яким файлом незалежно від типу.
Меттью Шарлі

4
Якщо ви коли-небудь насправді турбуєтесь про те, щоб зробити щось нерозумно, я alias rm="rm -i"врятував більше шкір, ніж майже все інше там, я думаю.
Меттью Шарлі

832

скористайтеся командою "від’єднати" і переконайтеся, що не має / в кінці

$ 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дисципліну слід використовувати при роботі з будь-якою частиною вашої структури каталогу.
Doug Powers

1
У сценаріїх rm -fбуде мовчки видалено посилання незалежно від того, існує чи ні, тоді як unlinkскаржиться, якщо посилання відсутнє. Немає варіанта `-f ', еквівалентного для від’єднання, робить сценарій складнішим.
приголомшливий користувач 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. Жодна з перерахованих вище пропозицій, здається, не працює. Врешті-решт зробив копію каталогу, якщо потім видалив програмне посилання в Провіднику Windows, а потім видалив елемент у Кошику. Він шумів, як видалення файлів, але не. Зробити резервну копію, хоча!


3
"Звучали шуми, як видалення файлів ..." - Нічого собі!
Sterex

LMFAO. "Звучало таке звучання, як видалення файлів ..."
Шивам Джа

Я пам’ятаю дискети!
Кіт Віттінгем

Ніщо з перерахованого вище не працювало для мене: eddyq @ eddyq-Latitude-E6440: ~ $ ls Завантаження на робочий стіл Dropbox-Windows Music Відкрите відео w Документи Dropbox example.desktop Картинки Шаблони 'VmWare файли
vmx
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.