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