Tìm ra mục tiêu liên kết tượng trưng thông qua dòng lệnh


130

Nói rằng tôi thiết lập một liên kết tượng trưng:

ln -s /root/Public/mytextfile.txt /root/Public/myothertextfile.txt

Có cách nào để xem mục tiêu myothertextfile.txtđang sử dụng dòng lệnh là gì không?

Câu trả lời:


171

Sử dụng -fcờ để in phiên bản chuẩn. Ví dụ:

readlink -f /root/Public/myothertextfile.txt

Từ man readlink:

-f, --canonicalize
      canonicalize by following every symlink in every component of the given name recursively; all but the last component must exist

8
Như được đề xuất trong một câu hỏi khác , bạn có thể muốn sử dụng readlink -f.
Denilson Sá Maia

5
Để làm việc này trên Mac OS X , brew install coreutils. Điều này cài đặt các phiên bản gnu cơ bản của các lệnh có tiền tố với chữ cái g, tức làgreadlink -f somefile
Mike D

với -f switch, lệnh không trả về gì trong trường hợp của tôi ..
sotn

Sử dụng -f đã cho tôi thông tin mà tôi muốn, tức là giải quyết nhiều liên kết tượng trưng và hiển thị mục tiêu cuối cùng.
isapir

trên Ubuntu 18.04.1 LTS (Bionic Beaver)các trang của readlink có một ghi chú cho biết "Note realpath (1) là lệnh ưa thích để sử dụng cho chức năng chuẩn hóa."
Sam Kamensky

23

readlink là lệnh bạn muốn. Bạn nên nhìn vào trang man cho lệnh. Bởi vì nếu bạn muốn theo một chuỗi các liên kết tượng trưng đến tệp thực tế, thì bạn cần chuyển đổi -e hoặc -f:

$ ln -s foooooo zipzip   # fooooo doesn't actually exist
$ ln -s zipzip zapzap

$ # Follows it, but doesn't let you know the file doesn't actually exist
$ readlink -f zapzap
/home/kbrandt/scrap/foooooo

$ # Follows it, but file not there
$ readlink -e zapzap

$ # Follows it, but just to the next symlink
$ readlink zapzap
zipzip

Không có gì sai với câu trả lời đầu tiên, nhưng câu trả lời này đầy đủ và hữu ích hơn.
Mike S

6

Điều này cũng sẽ làm việc:

ls -l /root/Public/myothertextfile.txt

nhưng readlinksẽ được ưu tiên sử dụng trong tập lệnh hơn là phân tích cú pháp ls.


4

Nếu bạn muốn hiển thị nguồn và đích của liên kết, hãy thử stat -c%N files*. Ví dụ

$ stat -c%N /dev/fd/*
‘/dev/fd/0’ -> ‘/dev/pts/4’
‘/dev/fd/1’ -> ‘/dev/pts/4’

Nó không tốt cho việc phân tích cú pháp (sử dụng readlinkcho điều đó), nhưng nó hiển thị tên liên kết và đích, mà không có sự lộn xộn củals -l

-ccó thể được viết --format%Ncó nghĩa là tên tập tin được trích dẫn với sự bổ nhiệm nếu liên kết tượng trưng.


2

Đây readlinklà một điều tốt, nhưng cụ thể là GNU và không đa nền tảng. Tôi đã từng viết các kịch bản đa nền tảng cho /bin/sh, do đó tôi sẽ sử dụng một cái gì đó như:

 ls -l /root/Public/myothertextfile.txt | awk '{print $NF}'

hoặc là:

 ls -l /root/Public/myothertextfile.txt | awk -F"-> " '{print $2}'

nhưng những điều này cần phải được thử nghiệm trên các nền tảng khác nhau. Tôi nghĩ rằng chúng sẽ hoạt động, nhưng không chắc chắn 100% cho lsđịnh dạng đầu ra.

Kết quả lscũng có thể được phân tích cú pháp bên trong bashmà không phụ thuộc vào một lệnh bên ngoài như awk, sedhoặc perl.

bash_realpathHàm này , giải quyết đích cuối cùng của một liên kết (liên kết → liên kết → liên kết → cuối cùng):

bash_realpath() {
  # print the resolved path
  # @params
  # 1: the path to resolve
  # @return
  # >&1: the resolved link path

  local path="${1}"
  while [[ -L ${path} && "$(ls -l "${path}")" =~ -\>\ (.*) ]]
  do
    path="${BASH_REMATCH[1]}"
  done
  echo "${path}"
}

1

Nếu bạn không thể sử dụng readlink, thì việc phân tích kết quả ls -lcó thể được thực hiện như thế này.

Kết quả bình thường sẽ là:

ls -l /root/Public/myothertextfile.txt
lrwxrwxrwx 1 root root 30 Jan  1 12:00 /root/Public/myothertextfile.txt -> /root/Public/mytextfile.txt

Vì vậy, chúng tôi muốn thay thế mọi thứ trước "->" và bao gồm mũi tên. Chúng ta có thể sử dụng sedcho việc này:

ls -l /root/Public/myothertextfile.txt | sed 's/^.* -> //'
/root/Public/mytextfile.txt

1

Câu hỏi không đủ chính xác để đưa ra một câu trả lời đơn giản như một trong những câu brian-brazil:

readlink -f some_path

thực sự sẽ hủy bỏ mọi liên kết tượng trưng liên quan đến việc xây dựng đường dẫn đến mục tiêu cuối cùng phía sau some_path.

Nhưng một cấp độ của các liên kết xếp tầng chỉ là một trường hợp cụ thể trong số các liên kết khác trong một hệ thống, trường hợp chung là N cấp của các liên kết xếp tầng. Nhìn vào những điều sau đây trên hệ thống của tôi:

$ rwhich emacs
/usr/bin/emacs
 /etc/alternatives/emacs
  /usr/bin/emacs24-x

rwhichlà việc thực hiện đệ quy của riêng tôi về whichviệc in tất cả các liên kết xếp tầng trung gian (đến stderr) xuống mục tiêu cuối cùng (tới thiết bị xuất chuẩn).

Sau đó, nếu tôi muốn biết những gì là:

  • mục tiêu của symlink / usr / bin / emacs **, câu trả lời rõ ràng với tôi là được /etc/alternatives/emacstrả về bởi:

    readlink $(which emacs)
    readlink /usr/bin/emacs
    
  • các thức mục tiêu đằng sau tầng symlink / usr / bin / emacs, câu trả lời sẽ được /usr/bin/emacs24-xnhư trả về bởi:

    readlink -f $(which emacs)
    readlink -f /usr/bin/emacs
    rwhich emacs 2>/dev/null
    

0

llhoặc ls -lnên liệt kê các mục thư mục, bao gồm liên kết tượng trưng của bạn và mục tiêu của nó

cd -P /root/Public/myothertextfile.txt (trong trường hợp của bạn) nên trỏ đến đường dẫn ban đầu


0

Nếu bạn tìm thấy mục tiêu của tất cả các liên kết trong một thư mục và thư mục con của nó, hãy sử dụng find . -type l -lslệnh với loại liên kết như sau:

me@local.localdomain:~/test$ find . -type l -ls
8601855888        0 lrwxr-xr-x    1 me           staff                   6 Jan 24 19:53 ./link -> target

Nếu bạn muốn mục tiêu của một đơn, thì ls -lnên hoạt động:

me@local.localdomain:~/test$ ls -l 
total 0
lrwxr-xr-x  1 me  staff  6 Jan 24 19:53 link -> target
-rw-r--r--  1 me  staff  0 Jan 24 19:53 target
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.