Điểm:0

Làm cách nào tôi có thể tìm kiếm các liên kết tượng trưng trỏ đến các liên kết tượng trưng khác?

lá cờ ng

Tôi có rất nhiều liên kết tượng trưng như thế này nằm rải rác xung quanh:

A (liên kết tượng trưng) -> B (liên kết tượng trưng) -> C (tệp)

Một số thậm chí có thể liên quan đến chuỗi dài hơn, tôi chưa chắc chắn.

Khi kiểm tra một tệp theo cách thủ công, thật dễ dàng để biết điều gì đang diễn ra nhưng tôi đang tìm một cách tự động để tìm những tệp này và (tốt nhất là) dọn sạch chúng.

Trong ví dụ trên, tôi muốn liên kết tượng trưng B->C giữ nguyên vị trí nhưng liên kết tượng trưng A->B sẽ trở thành A->C

Xác định chúng nếu mục tiêu chính; số lượng có thể đủ thấp để sửa chúng theo cách thủ công sẽ không phải là vấn đề lớn. Nhưng việc tìm kiếm tất cả chúng theo cách thủ công là không khả thi.

Tôi biết về tiện ích "liên kết tượng trưng" và tiện ích này hữu ích trong nhiều trường hợp như tìm liên kết tượng trưng lơ lửng, nhưng dường như nó không có khả năng phát hiện "chuỗi" như thế này

Tôi biết "find -type l" cũng như tùy chọn -L cho find nhưng chúng dường như không hoạt động cùng nhau vì "find -L -type l" luôn trả về một phản hồi trống.

Tôi sử dụng "find -type l -exec ls -l {} +" (hoạt động tốt hơn tùy chọn -ls của find) và cố gắng sử dụng nó để lấy danh sách các đích đến của liên kết tượng trưng mà sau đó tôi có thể kiểm tra xem chúng có ' có liên kết tượng trưng hay không, tuy nhiên, tất cả các liên kết tượng trưng là tương đối chứ không phải tuyệt đối nên đầu ra hơi lộn xộn

ví dụ tôi nhận được đầu ra như thế này:

lrwxrwxrwx 1 tên người dùng 50 ngày 5 tháng 11 01:00 ./a/b/c/d -> ../../e/f/g/h

Từ đó tôi phải suy nghĩ một chút để tìm ra rằng đích thực của liên kết tượng trưng là ./a/e/f/g/h (và sau đó tôi có thể kiểm tra xem đó có phải là liên kết tượng trưng hay không), không thực sự lý tưởng cho tự động hóa

Nếu các liên kết tượng trưng (tạm thời) tuyệt đối thay vì tương đối thì điều này sẽ dễ dàng hơn nhưng tiện ích "liên kết tượng trưng" chỉ có thể chuyển đổi tuyệt đối -> tương đối; theo như tôi có thể nói thì nó không thể chuyển đổi tương đối -> tuyệt đối.

Điểm:1
lá cờ nl

Theo toàn bộ chuỗi liên kết

con đường thực tế

đường dẫn thực(1) đưa bạn đến đích tuyệt đối của một liên kết. Nhưng nó chỉ mang lại cho bạn cuối cùng đích, vì vậy nếu bạn có một chuỗi liên kết, nó sẽ chỉ hiển thị cho bạn đường dẫn của tệp/thư mục thực cuối cùng mà chuỗi cuối cùng trỏ tới.

Vì vậy, trong trường hợp của bạn, nếu ../../e/f/g/h là tệp hoặc thư mục thực, bạn sẽ thấy đường dẫn tuyệt đối. Nhưng nếu một trong các thành phần cũng là một liên kết tượng trưng, ​​thì nó sẽ tiếp tục đệ quy cho đến khi nó giải quyết tất cả các liên kết tượng trưng theo cách đó.

liên kết đọc

Bạn cũng có thể sử dụng liên kết đọc(1) lệnh với các cờ -f hoặc -e, sẽ cho bạn kết quả tương tự như con đường thực tế.

  -f, --canonicalize canonicalize bằng cách theo mọi liên kết tượng trưng trong
                                mọi thành phần của tên đã cho theo cách đệ quy;
                                tất cả trừ thành phần cuối cùng phải tồn tại
  -e, --canonicalize-current canonicalize bằng cách theo mọi liên kết tượng trưng trong
                                mọi thành phần của tên đã cho theo cách đệ quy,
                                tất cả các thành phần phải tồn tại

Tránh theo toàn bộ chuỗi liên kết

Nếu tôi hiểu chính xác, bạn không muốn đi theo chuỗi đến thành phần cuối cùng mà chỉ nhận được đường dẫn tuyệt đối của liên kết thực tế. Nó hơi xấu, nhưng bạn có thể làm điều gì đó như:

LIÊN KẾT=./a/b/c/d
/usr/bin/realpath --no-symlinks "$(dirname ${LINK})/$(readlink ${LINK})"

Giải trình:

$ dirname $LINK # dirname ./a/b/c/d
./a/b/c

$ liên kết đọc $LINK # liên kết đọc ./a/b/c/d
../../e/f/g/h

$ echo "$(tên thư mục ${LINK})/$(đường dẫn đọc ${LINK})" 
./a/b/c/../../e/f/g/h

$ /usr/bin/realpath --no-symlinks "$(dirname ${LINK})/$(readlink ${LINK})"
/nhà/a/e/f/g/h

Nếu bạn chỉ muốn xem liên kết liên quan đến CWD của mình, bạn có thể thêm đối số --relative-to:

$ /usr/bin/realpath --no-symlinks --relative-to ./ "$(dirname ${LINK})/$(readlink ${LINK})"
a/e/f/g/h

sử dụng tìm

Bạn có thể lấy đối số cho lệnh realpath mà tôi đã trình bày trước đây bằng cách sử dụng lệnh find:

$ find ./ -type l -printf "%h/%l\n"
./a/b/c/../../e/f/g/h

Từ người đàn ông tìm thấy:

%h Các thư mục đầu của tên tệp (tất cả trừ phần tử cuối cùng). Nếu
       tên tệp không chứa dấu gạch chéo (vì nó nằm trong định dạng hiện tại
       thư mục), trình xác định %h mở rộng thành ".".

%l Đối tượng của liên kết tượng trưng (chuỗi trống nếu tệp không phải là liên kết tượng trưng).

Sau đó, bạn có thể kết hợp nó với lệnh realpath ở trên.

$ find ./ -type l -printf "%h/%l\n" | xargs /usr/bin/realpath -s
/nhà/a/e/f/g/h

Nếu bạn chỉ muốn xem liên kết liên quan đến CWD của mình:

$ find ./ -type l -printf "%h/%l\n" | xargs /usr/bin/realpath -s --relative-to ./
a/e/f/g/h
Displayname71 avatar
lá cờ ng
Thật thú vị... thực tế là nó đi theo chuỗi đến cùng không phải là lý tưởng nhưng tôi có thể tham chiếu chéo đầu ra đường dẫn thực với thông tin đích trên "ls -l" để xem chúng có khớp không
aviro avatar
lá cờ nl
Tôi đã chỉnh sửa câu trả lời của mình và thêm một tùy chọn khác, tùy chọn cuối cùng có thể là thứ bạn đang tìm kiếm.
aviro avatar
lá cờ nl
@ Displayname71, tôi đã thêm một số tùy chọn khác vào câu trả lời của mình, hy vọng một trong số chúng sẽ phù hợp với nhu cầu của bạn

Đăng câu trả lời

Hầu hết mọi người không hiểu rằng việc đặt nhiều câu hỏi sẽ mở ra cơ hội học hỏi và cải thiện mối quan hệ giữa các cá nhân. Ví dụ, trong các nghiên cứu của Alison, mặc dù mọi người có thể nhớ chính xác có bao nhiêu câu hỏi đã được đặt ra trong các cuộc trò chuyện của họ, nhưng họ không trực giác nhận ra mối liên hệ giữa câu hỏi và sự yêu thích. Qua bốn nghiên cứu, trong đó những người tham gia tự tham gia vào các cuộc trò chuyện hoặc đọc bản ghi lại các cuộc trò chuyện của người khác, mọi người có xu hướng không nhận ra rằng việc đặt câu hỏi sẽ ảnh hưởng—hoặc đã ảnh hưởng—mức độ thân thiện giữa những người đối thoại.