2008-09-19 28 views
50

Tôi có một thư mục trên máy chủ mà tôi đã có một số liên kết tượng trưng trỏ. Tôi đã tạo một thư mục mới và tôi muốn thay đổi tất cả các liên kết tượng trưng đó để trỏ đến thư mục mới. Tôi đã xem xét việc thay thế thư mục gốc bằng một liên kết tượng trưng đến thư mục mới, nhưng có vẻ như nếu tôi tiếp tục với thực hành đó, nó có thể rất lộn xộn rất nhanh.Có cách nào để kiểm tra xem có các liên kết tượng trưng trỏ đến một thư mục không?

Điều tôi đang làm là thay đổi các liên kết tượng trưng theo cách thủ công để trỏ đến thư mục mới, nhưng có thể tôi đã bỏ lỡ một cặp vợ chồng.

Có cách nào để kiểm tra xem có bất kỳ liên kết tượng trưng nào trỏ đến một thư mục cụ thể không?

Trả lời

63

Tôi muốn sử dụng lệnh tìm.

find . -lname /particular/folder 

Điều đó sẽ đệ quy tìm kiếm thư mục hiện tại cho các liên kết tượng trưng đến /particular/folder. Lưu ý rằng nó sẽ chỉ tìm thấy các liên kết tuyệt đối. Một lệnh tương tự có thể được sử dụng để tìm kiếm cho tất cả các liên kết tượng trưng chỉ vào đối tượng gọi là "thư mục":

find . -lname '*folder' 

Từ đó bạn sẽ cần phải loại bỏ bất kỳ dương tính giả.

+4

cảm ơn, hoạt động tốt. cho bất kỳ ai khác cố gắng này: bằng cách sử dụng chuyển đổi -maxdepth thực sự đã giúp tăng tốc độ tìm kiếm, vì tôi biết ở độ sâu các liên kết sẽ được. – nickf

+1

Ồ, đây chính xác là những gì tôi đang tìm kiếm. Cảm ơn skymt cho câu trả lời và @nickf để đặt câu hỏi :) – icasimpan

+1

Cảm ơn. Chỉ cần cẩn thận rằng sự hiện diện của dấu gạch chéo hoặc không trong liên kết có thể làm thay đổi kết quả. Vì vậy, bạn có thể cần một 'tìm. -tên '* thư mục?' ' – regilero

1
find/-lname 'fullyqualifiedpathoffile' 
1

Đối với liên kết cứng, bạn có thể lấy inode của thư mục của bạn với một trong những "ls" tùy chọn (-i, tôi nghĩ).

Sau đó, find với -inum sẽ định vị tất cả các liên kết cứng phổ biến.

Đối với các liên kết mềm, bạn có thể phải thực hiện ls -l trên tất cả các tệp tìm kiếm văn bản sau "->" và chuẩn hóa nó để đảm bảo đó là đường dẫn tuyệt đối.

+0

Điều này sẽ hoạt động tốt để tìm tất cả các liên kết cứng đến một tệp. Nhưng các liên kết cứng đến một thư mục là không lớn. Trình điều khiển hệ thống tập tin sẽ không cho phép bạn tạo ra một thứ như vậy, và nếu bạn đủ masochistic để đi vào và chỉnh sửa phân vùng thô bằng tay để tạo một phân vùng, nó làm cho rất nhiều thứ không hài lòng. – Thomee

+0

Tôi cũng không đề xuất các liên kết cứng tới các thư mục, nhưng TimeMachine trên OS X sử dụng chúng. E.G: http://belkadan.com/blog/2011/07/rm-vs-Time-Machine/ –

5

Không thực sự có cách nào trực tiếp để kiểm tra các liên kết tượng trưng như vậy. Hãy xem xét rằng bạn có thể có một hệ thống tập tin mà không được gắn kết tất cả các thời gian (ví dụ như một ổ đĩa USB bên ngoài), có thể chứa các liên kết đến một ổ đĩa khác trên hệ thống.

Bạn có thể làm điều gì đó với:

for a in `find/-type l`; do echo "$a -> `readlink $a`"; done | grep destfolder 

tôi lưu ý rằng FreeBSD của find không hỗ trợ tùy chọn -lname, đó là lý do tôi đã kết thúc với trên.

2

Ngoài việc xem tất cả các thư mục khác nếu có các liên kết trỏ đến thư mục gốc, tôi không nghĩ là có thể. Nếu có, tôi sẽ quan tâm.

3
find . -type l -printf '%p -> %l\n' 
6

Bạn có thể kiểm tra liên kết tượng trưng với the symlinks program được viết bởi Mark Chúa - nó sẽ quét toàn bộ hệ thống tập tin, bình thường hóa đường dẫn liên kết tượng trưng cho hình thức tuyệt đối và in chúng để stdout.

1
find /foldername -type l -exec ls -lad {} \; 
+0

Điều này hoạt động tốt trên Mac. Cảm ơn. Tìm thấy một số liên kết mềm độc hại trên một trang web đã được thực hiện bởi một hack wordpress. có thật không. cảm ơn. – Vik

Các vấn đề liên quan