Chỉ tìm điểm đến của symlink


50

Để sử dụng trong tập lệnh shell, tôi đang tìm một cách dòng lệnh để đến đích của một liên kết tượng trưng. Gần nhất tôi đã đến cho đến nay là stat -N src, đầu ra src -> dst. Tất nhiên tôi có thể phân tích đầu ra và nhận dst, nhưng tôi tự hỏi nếu có một số cách trực tiếp để có được đích.

Câu trả lời:


61

Một lựa chọn khác là sử dụng lệnh được thiết kế đặc biệt readlinknếu có sẵn.

Ví dụ

$ readlink -f `command -v php`
/usr/bin/php7.1

21
Sử dụng readlink -fnếu bạn muốn biết mục tiêu liên kết tượng trưng cuối cùng và không chỉ mục tiêu tiếp theo .
scai

Điểm tốt! Quên điều đó đi.
nikitautiu

11
Lưu ý rằng đó -flà một phần mở rộng không di động cho GNU readlink.
bahamat

2
Khi nào readlink sẽ không có sẵn? Cảm ơn.
tommy.carstensen 29/07/2015

2
@ tommy.carstensen readlink (1) đã được thêm vào GNU coreutils vào năm 2003, vì vậy ngày nay bạn có thể phụ thuộc vào nó trên thực tế tất cả các hệ thống sử dụng coreutils. (Cf. git.savannah.gnu.org/cgit/coreutils.git/commit/src/ mẹo )
Josip Rodin

16

Trên Mac OS X và FreeBSD / NetBSD / v.v. nó là:

stat -f %Y <filename>

Tổng quát hơn, tôi đoán giải pháp là (stat --printf =% N sử dụng dấu ngoặc kép):

ls -l b | sed -e 's/.* -> //'

Thí dụ:

# ln -s a b
# stat -f %Y b
a

Một phương pháp khác là:

# find b -maxdepth 0 -printf %l
a#

Dòng cuối cùng được đọc sai bởi vì nó không có dòng mới, nhưng điều đó cũng tốt nếu bạn cần kết quả trong một biến, như vậy

# f=$(find b -maxdepth 0 -printf %l)
# echo $f
a

Điều -maxdepthnày là cần thiết để ngăn chặn việc findđi xuống vào thư mục nếu btình cờ là một thư mục.


Tôi hoàn toàn đọc lướt qua, stat --printf='%N\n'chính xác là những gì tôi muốn, những câu trích dẫn kỳ lạ không làm phiền tôi, cùng một câu trích dẫn rm và sử dụng tương tác
ThorSummoner

Điều này dường như không khả dụng vì trên Linux, chỉ số GNU (1) của GNU coreutils có các tham số khác nhau và được in ra link -> destở đầu ra. Cần kiểm tra giải pháp find (1) nếu tìm thấy với GNU findutils hoặc nếu không ...
Josip Rodin

Xin đừng quên trích dẫn các mở rộng biến đổi của bạn, echo $fchắc chắn không tạo ra những gì bạn mong đợi khi liên kết tượng trưng chỉ đến /*(vâng, điều đó là có thể)
Camusensei 17/03/2017

3

Điều này có thể được thực hiện bằng GNU find: find src -prune -printf "%l\n".


1

Có thể: không có may mắn ngoại trừ sử dụng phương pháp phỏng đoán để phân tích đầu ra ls -l hoặc sử dụng perl -le 'print readlink("some-file")'

một số hệ thống có một readlinklệnh, một số có -ftùy chọn để có được đường dẫn tuyệt đối.

Có nhiều cách triển khai khác nhau của statlệnh như là một trình bao bọc cho các cuộc gọi stat/ lstathệ thống. GNU one không hữu ích trong vấn đề đó, nhưng cái dựng sẵn của zsh thì hơn thế:

zmodload zsh/stat
stat +link the-link

Vẫn với zsh, bạn có thể nhận được đường dẫn tuyệt đối của một tệp (loại bỏ mọi thành phần liên kết tượng trưng) bằng công cụ :Asửa đổi (áp dụng cho mở rộng biến, mở rộng lịch sử và toàn cầu hóa:

~$ gstat -c %N b
`b' -> `a'
~$ var=b
~$ echo $var:A
/home/me/a
~$ echo b(:A)
/home/me/a
~$ echo ?(@:A)
/home/me/a

1

Trên một hệ thống mà tôi không có readlinkhoặc có statlệnh nhưng tôi có Python 2.x, tôi đang sử dụng một đoạn script ngắn:

#!/usr/bin/env python

import os, sys

if __name__ == "__main__":
    src = sys.argv[1]
    target = os.readlink(src)
    if not os.path.isabs(target):
            target = os.path.abspath(os.path.join(os.path.dirname(src), target))
    print target

Lưu ý rằng không giống như readlink -fđiều này chỉ có thể theo một cấp độ liên kết tượng trưng.


1

Di động Bash thuần thực

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}"
}

0

realpathlệnh coreutilsgói,

như được liên kết trong readlinktrang hướng dẫn của lệnh.


ví dụ:

realpath /bin/python

đầu ra

/usr/bin/python2.7

trên máy của tôi

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.