Xóa một liên kết tượng trưng đến một thư mục


1085

Tôi có một symlink đến một thư mục quan trọng. Tôi muốn thoát khỏi symlink đó, trong khi vẫn giữ thư mục phía sau nó.

Tôi đã thử rmvà lấy lại rm: cannot remove 'foo'.
Tôi đã thử rmdirvà lấy lại, rmdir: failed to remove 'foo': Directory not empty
sau đó tôi đã vượt qua rm -f, rm -rfsudo rm -rf

Sau đó, tôi đã đi tìm bản sao lưu của mình.

Có cách nào để thoát khỏi liên kết tượng trưng với việc vứt bỏ em bé bằng nước tắm không?


74
Có gì sai khi đặt câu hỏi liên quan đến linux? lần trước tôi đã kiểm tra, tràn ngăn xếp không phải là đặc thù của os
Jeremy Cantrell

6
Câu hỏi này sẽ không phù hợp hơn với Super User hay Stack Exchange liên quan đến Linux?
mwfearnley

45
@mwfearnley Nó sẽ được, nhưng kiểm tra ngày. Super User chưa phải là một điều trước đó. Nó đã được chuyển, vì vậy nó cũng ở đó. Không chắc tại sao nó vẫn ở đây, nhưng đó là câu hỏi ghi điểm cao nhất của tôi và tôi sẽ không nhìn thấy nghiệp chướng trong miệng.
Matthew Scouten

16
rm -r link/
MIPO

31
Then I went to find my back-ups- Điều đó làm tôi cười thầm.
frakman1

Câu trả lời:


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

Về cơ bản, bạn cần bảo nó xóa một tập tin , không xóa một thư mục . Tôi tin rằng sự khác biệt giữa rmrmdirtồn tại là do sự khác biệt trong cách thư viện C đối xử với nhau.

Ở bất cứ giá nào, cái đầu tiên sẽ hoạt động, trong khi cái thứ hai nên phàn nàn về việc foo là một thư mục.

Nếu nó không hoạt động như trên, thì hãy kiểm tra quyền của bạn. Bạn cần có quyền ghi vào thư mục chứa để loại bỏ các tập tin.


121
à vâng Điều đó có ý nghĩa. Tôi chưa bao giờ gõ foo, tôi đã gõ f <tab> và bash điền vào a / cho tôi.
Matthew Scouten

6
Điều này không phải lúc nào cũng hoạt động. Thỉnh thoảng bạn cần chạy rm -rf folderName(không theo dõi /) để xóa liên kết tượng trưng. Ví dụ, Amazon Linux hoạt động theo cách này trong một số trường hợp nhất định.
brandonscript

18
@ r3mus: Không bao giờ sử dụng -rvới symlink trừ khi bạn muốn mất mọi thứ bên trong nó. -fkhông nên là cần thiết, ngoại trừ có lẽ để ghi đè quyền truy cập tệp.
Matthew Scharley

27
Cụ thể, unlinkkhông liên quan đến lnhoạt động 'liên kết' của AKA. Tên này unlinkđề cập đến quá trình hủy liên kết / xóa tệp khỏi bảng tệp của hệ thống tệp để nội dung bị tách ra khỏi mọi tham chiếu đến chúng - chúng không được liên kết. Đó là một cái tên khó hiểu, hoàn toàn sai lệch khi được áp dụng cho các liên kết và liên kết tượng trưng nói riêng. unlinksẽ hoạt động với symlink vì nó hoạt động với mọi tệp bất kể loại nào.
Matthew Scharley

4
Nếu bạn thực sự lo lắng về việc làm điều gì đó ngớ ngẩn, tôi alias rm="rm -i"đã tiết kiệm được nhiều ẩn hơn bất cứ thứ gì khác ngoài tôi nghĩ.
Matthew Scharley

832

sử dụng lệnh "hủy liên kết" và đảm bảo không có / ở cuối

$ unlink mySymLink

unlink () xóa tên khỏi hệ thống tệp. Nếu tên đó là liên kết cuối cùng đến một tệp và không có quy trình nào mở tệp thì tệp sẽ bị xóa và không gian mà nó đang sử dụng được cung cấp để sử dụng lại. Nếu tên là liên kết cuối cùng đến một tệp nhưng bất kỳ quy trình nào vẫn có tệp mở thì tệp sẽ tồn tại cho đến khi mô tả tệp cuối cùng đề cập đến nó được đóng lại.

Tôi nghĩ rằng điều này có thể có vấn đề nếu tôi đọc nó một cách chính xác.

Nếu tên được gọi là một liên kết tượng trưng, ​​liên kết sẽ bị xóa.

Nếu tên được gọi là ổ cắm, fifo hoặc thiết bị, tên của nó sẽ bị xóa nhưng các quá trình có đối tượng mở có thể tiếp tục sử dụng nó.

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


33
@OmarAbid Phiên bản "rm foo /" làm tôi sợ. Cái này có vẻ an toàn hơn nhiều :)
Joe Phillips

9
Trong Ubuntu, tôi thử nghiệm với ~/c/a/file, /c/b/với ln -s ~/c/a ~/c/b/. Trong ~/c/b/, rm a/không hoạt động, rm -rf a/chỉ làm trống bản gốc a. unlink ahoạt động hoàn hảo, và unlink a/không làm gì cả.
Brady Trainor

3
Trong OS X 10.10, unlinkchỉ đơn giản là một bí danh cho rm. Cho thấy rằng rmkỷ luật thích hợp nên được sử dụng khi làm việc với bất kỳ phần nào trong cấu trúc thư mục của bạn.
Doug Powers

1
Trong kịch bản rm -fsẽ âm thầm xóa một liên kết cho dù nó có tồn tại hay không, trong khi đó unlinksẽ khiếu nại nếu liên kết không có. Không có tùy chọn `-f 'tương đương với hủy liên kết, làm cho tập lệnh phức tạp hơn.
người dùng linux shonky 24/8/2015

22
unlinkcó thể xóa các tập tin thông thường. nó ít tính năng hơn rmvà không cụ thể cho các liên kết tượng trưng. rmkhông xóa các thư mục mà không có -rcờ. Vì vậy, tôi khuyên bạn nên thích rm, nó có cờ cho dài dòng và tương tác; cũng như các thông báo cảnh báo và lỗi có ý nghĩa.
ThorSummoner

18

rm nên loại bỏ các liên kết tượng trưng.

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

Sử dụng rm symlinknamenhưng không bao gồm dấu gạch chéo về phía trước (không sử dụng rm symlinkname/:). Sau đó, bạn sẽ được hỏi nếu bạn muốn xóa symlink, yđể trả lời có.


63
Bạn không sai, nhưng câu trả lời đúng đã ở đây và được chấp nhận (4 năm trước!). Quan tâm làm gì?
Matthew Scouten

1
Google đã coi đây là đoạn trích nổi bật khi tìm kiếm "Xóa liên kết tượng trưng". Có lẽ nó thích sự ngắn gọn của nó, không chắc cách thức hoạt động của nó. Dù sao, tôi đã kịp thời làm một facepalm khi tôi nhìn lại dòng lệnh của mình :-)
Randall

12

Giả sử nó thực sự là một liên kết tượng trưng,

$ rm -d symlink

Nó sẽ tìm ra nó, nhưng vì chúng ta không thể kích hoạt mã tiềm ẩn dành cho một trường hợp khác không còn tồn tại nhưng tình cờ thực hiện đúng ở đây.


7

Nếu rm không thể xóa liên kết tượng trưng, ​​có lẽ bạn cần xem xét các quyền trên thư mục chứa liên kết tượng trưng. Để loại bỏ các mục thư mục, bạn cần có quyền ghi trên thư mục chứa.


4

Giả sử thiết lập của bạn là một cái gì đó như : ln -s /mnt/bar ~/foo, thì bạn sẽ có thể thực hiện rm foomà không có vấn đề gì. Nếu bạn không thể, hãy chắc chắn rằng bạn là chủ sở hữu của foovà có quyền viết / thực thi tệp. Loại bỏ foosẽ không chạm vào bar, trừ khi bạn thực hiện đệ quy.


2

Trên CentOS, chỉ cần chạy rm linknamevà nó sẽ yêu cầu "xóa liên kết tượng trưng?". Nhập YEnter, liên kết sẽ biến mất và thư mục được an toàn.


2

Tôi gặp vấn đề này với MinGW (thực ra là Git Bash) đang chạy trên Windows Server. Không có gợi ý nào ở trên có vẻ hiệu quả. Cuối cùng, một bản sao của thư mục trong trường hợp sau đó xóa liên kết mềm trong Windows Explorer sau đó xóa mục trong Thùng rác. Nó tạo ra tiếng động như đang xóa các tập tin nhưng không được. Làm một bản sao lưu mặc dù!


3
"Nó tạo ra tiếng động như đang xóa các tập tin ..." - Wow!
Sterex

LMFAO. "Nó tạo ra tiếng động như đang xóa các tập tin ..."
Shivam Jha

Tôi nhớ đĩa mềm!
Keith Whmitham

Không có cách nào ở trên hoạt động với tôi: eddyq @ eddyq-Latitude-E6440: ~ $ ls Tải xuống máy tính để bàn Dropbox-Windows Music Video w w Tài liệu Dropbox
example.desktop
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.