Usuń dowiązanie symboliczne do katalogu

1085

Mam dowiązanie symboliczne do ważnego katalogu. Chcę pozbyć się tego dowiązania symbolicznego, zachowując jednocześnie katalog za nim.

Próbowałem rmi wróciłem rm: cannot remove 'foo'.
Próbowałem rmdiri wróciła rmdir: failed to remove 'foo': Directory not empty
Następnie rozwijał się przez rm -f, rm -rfisudo rm -rf

Potem poszedłem znaleźć swoje kopie zapasowe.

Czy istnieje sposób na pozbycie się dowiązania symbolicznego bez wyrzucania dziecka z kąpielą?

Matthew Scouten
źródło
74
co jest nie tak z zadawaniem pytań związanych z Linuksem? ostatnim razem, gdy sprawdzałem, przepełnienie stosu nie było specyficzne dla systemu
operacyjnego
6
Czy to pytanie nie byłoby bardziej odpowiednie dla superużytkownika lub związanej z Linuksem wymiany stosów?
mwfearnley
45
@mwfearnley Byłoby, ale sprawdź datę. Super Użytkownik nie był jeszcze wtedy rzeczą. Został przeniesiony, więc też tam jest. Nie jestem pewien, dlaczego wciąż tu jest, ale to moje pytanie, które uzyskało najwyższy wynik, i nie będę patrzył w usta karmie prezentowej.
Matthew Scouten
16
WSKAZÓWKA: rm -r link/ usuwa treść celu
Gayan Weerakutti
31
Then I went to find my back-ups- To mnie zachichotało.
frakman1

Odpowiedzi:

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

Zasadniczo musisz nakazać mu usunięcie pliku , a nie usunięcie katalogu . Wierzę, że różnica między rmi rmdiristnieje z powodu różnic w traktowaniu każdej biblioteki C.

W każdym razie pierwszy powinien działać, a drugi powinien narzekać na to, że foo jest katalogiem.

Jeśli to nie działa jak wyżej, sprawdź swoje uprawnienia. Aby usunąć pliki, musisz mieć uprawnienia do zapisu do zawierającego go katalogu.

Matthew Scharley
źródło
121
o tak. to ma sens. Nigdy nie wpisałem foo, wpisałem f <tab> i bash wypełniłem / dla mnie.
Matthew Scouten
6
To nie zawsze działa. Czasami musisz uruchomić rm -rf folderName(bez końcowego /), aby usunąć dowiązanie symboliczne. Amazon Linux zachowuje się w ten sposób, na przykład w pewnych okolicznościach.
brandonscript
18
@ r3mus: Nigdy nie używaj -rz dowiązaniem symbolicznym, chyba że chcesz stracić wszystko w nim zawarte. -fnie powinno być również potrzebne, z wyjątkiem być może zastąpienia uprawnień do plików.
Matthew Scharley
27
W szczególności unlinknie ma związku z lnoperacją „łącza” AKA. Nazwa unlinkodnosi się do procesu odłączania / usuwania pliku z tabeli plików systemu plików, dzięki czemu zawartość zostaje odłączona od wszelkich odniesień do nich - są one rozłączane. Jest to myląca nazwa, która jest wręcz myląca, szczególnie w przypadku linków i dowiązań symbolicznych. unlinkbędzie działać z dowiązaniami symbolicznymi, ponieważ działa z dowolnym plikiem, niezależnie od typu.
Matthew Scharley,
4
Jeśli kiedykolwiek martwisz się zrobieniem czegoś niemądrego, alias rm="rm -i"zaoszczędziłem więcej skór, niż tylko cokolwiek innego, jak sądzę.
Matthew Scharley,
832

użyj polecenia „unlink” i upewnij się, że nie ma znaku / na końcu

$ unlink mySymLink

unlink () usuwa nazwę z systemu plików. Jeśli ta nazwa była ostatnim linkiem do pliku i żaden proces nie otworzył pliku, plik zostanie usunięty, a miejsce, którego używał, zostanie udostępnione do ponownego użycia. Jeśli nazwa była ostatnim linkiem do pliku, ale jakikolwiek proces nadal ma otwarty plik, plik będzie istniał do momentu zamknięcia ostatniego odnoszącego się do niego deskryptora pliku.

Myślę, że może to być problematyczne, jeśli czytam to poprawnie.

Jeśli nazwa odnosi się do dowiązania symbolicznego, łącze jest usuwane.

Jeśli nazwa odnosi się do gniazda, fifo lub urządzenia, nazwa dla niej jest usuwana, ale procesy, w których obiekt jest otwarty, mogą nadal z niego korzystać.

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

Joe Phillips
źródło
33
@OmarAbid Przeraża mnie wersja „rm foo /”. Ten wydaje się o wiele bezpieczniejszy :)
Joe Phillips
9
W Ubuntu, mam przetestowane ~/c/a/file, /c/b/z ln -s ~/c/a ~/c/b/. W ~/c/b/, rm a/nie działa, rm -rf a/tylko opróżnia oryginału a. unlink adziała idealnie i unlink a/nic nie robi.
Brady Trainor,
3
W OS X 10.10 unlinkjest po prostu aliasem rm. Pokazuje, że rmnależy zachować odpowiednią dyscyplinę w kontaktach z dowolną częścią struktury katalogów.
Doug Powers,
1
W skryptach rm -fpo cichu usunie link, czy istnieje, czy też nie, a unlinknarzeka, jeśli link nie jest obecny. Brak opcji `-f 'dla polecenia unlink powoduje, że skrypt jest bardziej złożony.
shonky użytkownik Linuxa
22
unlinkmoże usuwać zwykłe pliki. jest mniej funkcjonalny rmi nie jest specyficzny dla dowiązań symbolicznych. rmnie usuwa również katalogów bez -rflagi. Więc zalecam preferowanie rm, ma flagi dla pełnych i interaktywnych; a także sensowne ostrzeżenia i komunikaty o błędach.
ThorSummoner,
18

rm powinien usunąć dowiązanie symboliczne.

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:~$ 
Steve K.
źródło
17

Użyj, rm symlinknameale nie dołącz ukośnika na końcu (nie używaj rm symlinkname/:). Następnie zostaniesz zapytany, czy chcesz usunąć dowiązanie symboliczne, yaby odpowiedzieć tak.

DeeEss09
źródło
63
Nie mylisz się, ale właściwa odpowiedź już tu jest i została zaakceptowana (4 lata temu!). Po co się męczyć?
Matthew Scouten
1
Google miał to jako opisany fragment podczas wyszukiwania „Usuń dowiązanie symboliczne”. Może podobało się jej zwięzłość, nie jestem pewien, jak działa jego heurystyka. W każdym razie natychmiast zrobiłem facepalm, gdy spojrzałem na linię poleceń :-)
Randall,
12

Zakładając, że faktycznie jest to dowiązanie symboliczne,

$ rm -d symlink

Powinien to rozgryźć, ale ponieważ nie możemy włączyć ukrytego kodu, który był przeznaczony dla innego przypadku, który już nie istnieje, ale zdarza się, że robi to dobrze.

Jozuego
źródło
7

Jeśli rm nie może usunąć dowiązania symbolicznego, być może trzeba spojrzeć na uprawnienia do katalogu zawierającego dowiązanie symboliczne. Aby usunąć pozycje katalogu, musisz mieć uprawnienia do zapisu w katalogu zawierającym.

Greg Hewgill
źródło
4

Zakładając, że twoja konfiguracja jest jak:, ln -s /mnt/bar ~/foowtedy powinieneś być w stanie zrobić to rm foobez problemu. Jeśli nie możesz, upewnij się, że jesteś właścicielem foopliku i masz uprawnienia do zapisu / wykonania pliku. Usunięcie foonie dotknie bar, chyba że zrobisz to rekurencyjnie.

TJ L.
źródło
2

Na CentOS po prostu uruchom rm linknamei poprosi o „usunięcie łącza symbolicznego?”. Wpisz Yi Enter, link zniknie, a katalog będzie bezpieczny.

Jurij
źródło
2

Miałem ten problem z MinGW (właściwie Git Bash) działającym na Windows Server. Żadna z powyższych sugestii nie działała. Na koniec zrobiłem kopię katalogu na wypadek, a następnie usunąłem miękkie łącze w Eksploratorze Windows, a następnie usunąłem element z Kosza. Wydawało odgłosy, jakby usuwało pliki, ale tak nie było. Zrób jednak kopię zapasową!

Keith Whittingham
źródło
3
„Wydawało dźwięki, jakby kasowało pliki ...” - Wow!
Sterex
LMFAO. „Wydawało dźwięki, jakby usuwało pliki ...”
Shivam Jha
Pamiętam dyskietki!
Keith Whittingham
Żadne z powyższych nie działało dla mnie: eddyq @ eddyq-Latitude-E6440: ~ $ ls Pliki do pobrania Dropbox-Windows Muzyka Publiczne filmy wideo w Dokumentach Przykłady Dropbox.desktop Zdjęcia Szablony „Pliki vmWare vmx”
eddyq