Làm thế nào để có được đường dẫn đầy đủ của tập tin gốc của một liên kết tượng trưng mềm?


99

Tôi muốn scpmột tập tin đến một máy chủ. Tệp này là một liên kết tượng trưng và thực sự những gì tôi muốn làm là sao chép tệp nguồn. Dù sao, tôi không muốn theo dõi đường dẫn của tệp nguồn theo cách thủ công, vì nó có thể được thay thế. Nếu tôi có thể có được đường dẫn tuyệt đối của tệp nguồn, tôi có thể sepvới nó. Làm thế nào tôi có thể có được con đường?


2
Hầu hết các scpphiên bản đều theo symlink theo mặc định, phải không? Bạn nên kiểm tra của bạn và có thể tiết kiệm cho mình một số công việc.
jw013

@ jw103 Cảm ơn đã cho tôi biết điều đó. Tôi không biết. :)
Eonil

2
Lưu ý: scp -rcác lực lượng theo liên kết tượng trưng.
Eonil

Câu trả lời:


129

Hãy thử dòng này:

readlink -f `which command`

Nếu commandlà trong $PATHbiến của bạn , nếu không bạn cần chỉ định đường dẫn bạn biết.


12
-fsẽ trả về một đường dẫn đến mục tiêu cuối cùng không tồn tại, miễn là các mục tiêu liên kết trung gian tồn tại ... Sử dụng -eđể tránh điều này, tức là. -esẽ trả về null nếu mục tiêu cuối cùng không tồn tại.
Peter.O

10
-fbị lỗi readlink: illegal option -- ftrong OSX. Loại bỏ nó hoạt động tốt.
Heath B ranh giới

2
@HeathBnings Đối với OSX nếu bạn đã cài đặt coreutils homebrew, bạn cũng có thể sử dụng greadlinkthay thế.
Adam Gent

23

Trong Linux, readlinkđọc nội dung của liên kết tượng trưng và readlink -ftheo liên kết tượng trưng đến liên kết tượng trưng đến liên kết tượng trưng, ​​v.v., cho đến khi tìm thấy nội dung không phải là liên kết tượng trưng.

Điều này không cần thiết cho scp mặc dù: scp luôn tuân theo các liên kết tượng trưng (nó luôn sao chép nội dung tệp, bỏ qua siêu dữ liệu ngoại trừ việc -pduy trì thời gian và chế độ tệp khi có thể).

Nếu bạn thấy thất vọng vì những gì siêu dữ liệu scp có thể và không thể bảo tồn, tôi khuyên bạn nên sử dụng rsync. Không có tùy chọn, rsync sao chép nội dung tệp bỏ qua siêu dữ liệu. Tùy chọn thường được sử dụng -abảo tồn tất cả siêu dữ liệu của khu vườn (thời gian, liên kết tượng trưng, ​​quyền và quyền sở hữu) và có các tùy chọn để bảo tồn siêu dữ liệu kỳ lạ như ACL và liên kết cứng.


readlink chỉ làm một bước duy nhất để đọc liên kết. ví dụ trong ubfox chúng ta có / bin / zsh, được liên kết với / etc / thay thế / zsh, nhưng đây là liên kết tượng trưng thứ hai. Cuối cùng, chúng tôi sẽ không nhận được đường dẫn tập tin hoặc thư mục thực sự. Tương tự là với lệnh stat. Chỉ đọc đường dẫn với tùy chọn -f mới thực hiện tất cả các giải pháp.
Znik

9

Tôi sử dụng lệnh ls, stat, readlink.

Lấy tập tin /etc/localtimelàm ví dụ

[flying@lempstacker ~]$ ls /etc/localtime 
/etc/localtime
[flying@lempstacker ~]$ ls -l /etc/localtime
lrwxrwxrwx. 1 root root 35 Aug  2 22:41 /etc/localtime -> ../usr/share/zoneinfo/Asia/Shanghai

Hoạt động

Sử dụng stat

[flying@lempstacker ~]$ stat /etc/localtime
  File: ‘/etc/localtime’ -> ‘../usr/share/zoneinfo/Asia/Shanghai’
  Size: 35          Blocks: 0          IO Block: 4096   symbolic link
Device: fd01h/64769d    Inode: 272202388   Links: 1
Access: (0777/lrwxrwxrwx)  Uid: (    0/    root)   Gid: (    0/    root)
Access: 2016-11-23 09:00:59.999887800 +0800
Modify: 2016-08-02 22:41:26.090389904 +0800
Change: 2016-08-02 22:41:26.090389904 +0800
 Birth: -
[flying@lempstacker ~]$ stat -c "%N" /etc/localtime
‘/etc/localtime’ -> ‘../usr/share/zoneinfo/Asia/Shanghai’

Sử dụng readlink

[flying@lempstacker ~]$ readlink /etc/localtime
../usr/share/zoneinfo/Asia/Shanghai
[flying@lempstacker ~]$ readlink -f /etc/localtime
/usr/share/zoneinfo/Asia/Shanghai

Có vẻ như lệnh đó readlink -flà tốt hơn.

Giải trình

-f, --canonicalize: canonicalize bằng cách theo từng symlink 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ạiman readlink


6

Stat sẽ cung cấp cho bạn thông tin này:

$ stat current
  File: `current' -> `/home/user/releases/build/'
  ...

readlink chỉ làm một bước duy nhất để đọc liên kết. ví dụ trong ubfox chúng ta có / bin / zsh, được liên kết với / etc / thay thế / zsh, nhưng đây là liên kết tượng trưng thứ hai. Cuối cùng, chúng tôi sẽ không nhận được đường dẫn tập tin hoặc thư mục thực sự. Tương tự là với lệnh stat. Chỉ đọc đường dẫn với tùy chọn -f mới thực hiện tất cả các giải pháp.
Znik

5

Bạn có thể làm

readlink -f `which command`

hoặc bạn có thể có được một cái gì đó tương tự trong Linux với

stat `which command` | grep File

Nếu bạn đang thêm phần này vào tập lệnh, hãy kiểm tra lỗi. Nếu bạn không muốn thấy thông báo lỗi trong trường hợp khi không có liên kết sym, hãy đi với một cái gì đó như

readlink -f "`which command`" 

stat và realink không có -f chỉ làm một bước duy nhất. sau đó tốt hơn gọi readlink -f.
Znik

3

Tôi sẽ sử dụng realpath <symlink>.

Có thể những gì bạn gọi là 'nguồn' là tệp 'đích' theo cách sử dụng của ln:Usage: ln [OPTION]... [-T] TARGET LINK_NAME


Cảm ơn Điều này làm việc như một nét duyên dáng! với Mac OSX! nơi mà readlinkkhông cắt nó ... mac ngu ngốc. lol
JayRizzo

0

readlink -f 'which java' không làm việc cho tôi.

Nhưng điều này đã làm:

readlink -f $(which java)

3
Không hoạt động vì nó `không '.. nhưng $()dù sao thì tốt hơn là thực hành.
Stephen Rauch

Tại sao downvote? Câu trả lời của tôi là một sự thay thế chấp nhận được, và, như nhận xét nói, một cách thực hành tốt hơn.
NonCreature0714

1
Hầu hết những người bỏ phiếu cũng không bình luận, vì vậy, yêu cầu giải thích về việc bỏ phiếu sẽ hiếm khi giúp bạn giải thích, vì cử tri xuống đã bỏ đi và không có khả năng quay lại. Tôi sẽ đề nghị bạn loại bỏ mã đánh máy không hoạt động từ câu trả lời của bạn. Tôi sẽ sẵn sàng bỏ phiếu nếu bạn dành thời gian để dọn dẹp và giải thích lý do tại sao $()thực hành tốt hơn.
Stephen Rauch

Như Stephen đã giải thích với bạn, 'không phải là `. Bạn nên gói gọn bởi command, nhưng điều này không được chấp nhận. sử dụng $ () sẽ tốt hơn, vì đóng gói $ ($ (lệnh)) dễ dàng hơn nhiều và không cần thoát đặc biệt. Sau đó, nó được ưa thích. Trong ví dụ đầu tiên của bạn, bạn đã sử dụng dấu nháy đơn thông thường, sau đó readlink đang cố gắng tìm tệp có tên 'which java' với khoảng trắng trong tên của nó. Nhưng bạn có ý định gọi lệnh mà với đối số java, để tìm đường dẫn thực thi nhị phân java.
Znik

0

Trên MAC OX, tham số "-f" không hoạt động, 'readlink' hoạt động mà không có bất kỳ tham số nào.

KZs-MacBook-Pro:bin kz$ readlink -f pip3
readlink: illegal option -- f
usage: readlink [-n] [file ...]

KZs-MacBook-Pro:bin kz$ readlink pip3
../../../Library/Frameworks/Python.framework/Versions/3.7/bin/pip3
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.