Làm cách nào tôi có thể liên kết một tệp trong Linux? [đóng cửa]


1940

Tôi muốn tạo một liên kết tượng trưng trong Linux. Tôi đã viết lệnh Bash này trong đó đường dẫn đầu tiên là thư mục tôi muốn liên kết và đường dẫn thứ hai là nguồn được biên dịch.

ln -s '+basebuild+'/IpDome-kernel/kernel /home/build/sandbox/gen2/basebuild/IpDome-kernel/kernal 

Điều này có đúng không?


Có lẽ bạn nên đặt câu hỏi này tại unix.stackexchange.com
Guss

Câu trả lời:


3678

Để tạo một symlink mới (sẽ thất bại nếu symlink đã tồn tại):

ln -s /path/to/file /path/to/symlink

Để tạo hoặc cập nhật một liên kết tượng trưng:

ln -sf /path/to/file /path/to/symlink

381
@micapam lnCú pháp tương tự cpcú pháp, ví dụ đích nguồn .
Andrey

157
Đây là một bản ghi nhớ dành cho bạn: l (i) n (k) -s (ymbolic) <target> <tên tùy chọn> (thực tế là tham số cuối cùng là tùy chọn giúp bạn nhận ra rằng đó không phải là mục tiêu) (btw rời khỏi đường dẫn đến symlink tạo một liên kết trong thư mục hiện tại có cùng tên cơ sở với mục tiêu)
UncleZeiv

32
@micapam Giống như cpCoPy, lnLiNk. Chữ cái thứ nhất và thứ ba.
Cole Johnson

68
Tôi đã dành vài phút để cố gắng tìm hiểu tại sao điều này không hiệu quả với tôi. Nó tạo ra một liên kết tự lặp. Có vẻ như / path / to / file phải tuyệt đối và không liên quan đến "thư mục hiện tại". Có lẽ chỉ ra điều này trong câu trả lời?
Abhishek Anand

52
@AbhishekAnand nó được một vài năm, nhưng tôi chỉ muốn rời khỏi lưu ý rằng nó không làm việc với đường dẫn tương đối; nó chỉ cần liên quan đến thư mục của biểu tượng liên kết chứ không phải thư mục hiện tại. Những gì bạn viết là đối số đường dẫn đầu tiên thực sự là nguyên văn, văn bản sẽ nằm trong liên kết tượng trưng; đó là lý do tại sao, khi nó tương đối, nó phải liên quan đến liên kết.
JoL

302
ln -s TARGET LINK_NAME

Nơi -slàm cho nó mang tính biểu tượng.


2
MỤC TIÊU & LINKNAME là cách tốt hơn để ghi nhớ. btw để xóa sử dụng symlink:unlink LINK_NAME
Silvan

31
Tôi thích diễn đạt nó theo cách này : ln -s where-the-symlink-should-point where-to-place-the-symlink-itself.
totymedli

@Silvan bạn có thể xóa một liên kết tượng trưng thông qua rm, nhưng hầu hết mọi người không biết để xóa dấu vết /.
FreeSoftwareServers

288
ln -s EXISTING_FILE_OR_DIRECTORY SYMLINK_NAME

2
Tốt hơn so với câu trả lời được chấp nhận và được bao phủ bởi sự ngắn gọn rõ ràng.
Josh Habdas

3
Ngoại trừ nó không phải là tên symlink mới. Đó là tên hoặc đường dẫn đầy đủ (liên quan đến cur dir hoặc tuyệt đối) cho liên kết tượng trưng mới bao gồm tên.
David Spector

ln -s EXISTING_FILE_OR_DIRECTORY {đường dẫn tùy chọn đến /} SYMLINK_NAME và không đặt dấu gạch chéo trên liên kết tượng trưng, ​​vì đó không phải là một thư mục
comfytoday


88

(Bởi vì một bức ảnh ASCII có giá trị bằng một ngàn ký tự.)

Một mũi tên có thể là một ghi nhớ hữu ích, đặc biệt là vì nó gần như chính xác trông như thế nào trong thư mục của Emacs.

Và hình ảnh lớn để bạn không bị nhầm lẫn với phiên bản Windows

Linux:

ln -s target <- linkName

Các cửa sổ:

mklink linkName -> target

Bạn cũng có thể nhìn vào những

ln -s "to-here" <- "from-here"
mklink "from-here" -> "to-here"

Cái from-herekhông nên tồn tại, nó sẽ được tạo ra, trong khi cái to-heređã tồn tại (IIRC).

(Tôi luôn bị lẫn lộn về việc liệu các lệnh và đối số khác nhau có liên quan đến một vị trí tồn tại trước đó hay một vị trí sẽ được thực hiện.)

EDIT: Nó vẫn đang chìm dần vào tôi; Tôi có một cách khác tôi đã viết trong ghi chú của tôi.

ln -s (target exists) (link is made)
mklink (link is made) (target exists)

Trong Emacs ' dired, thật dễ dàng, khi bạn đặt con trỏ lên mục tiêu của mình, nhấn Svà nhập thư mục mà bạn muốn liên kết được tạo. Rút ngắn khoảng cách giữa việc tưởng tượng kết quả mong muốn và gõ. Xem gnu.org/software/emacs/manual/html_node/emacs/ .
Brady Trainor

2
Bản ghi nhớ của tôi là BẬT: ln -s Bản gốc mới (symlink)
robstarbuck

cái này hiệu quả với tôi
Haider Ali


22

Đối với câu hỏi ban đầu:


'ln -s '+basebuild+'/IpDome-kernel/kernel /home/build/sandbox/gen2/basebuild/IpDome-kernel/kernal'

Điều này thực sự sẽ tạo ra một liên kết tượng trưng ( -s) từ tệp / thư mục:

<basebuild>/IpDome-kernel/kernel

đến liên kết mới của bạn

/home/build/sandbox/gen2/basebuild/IpDome-kernel/kernal

Dưới đây là một số cách giúp bạn nhớ:

Đầu tiên, có trang người đàn ông choln . Bạn có thể truy cập thông qua tìm kiếm "man ln" trong google hoặc chỉ cần mở một cửa sổ đầu cuối và nhập man lnvà bạn sẽ nhận được thông tin tương tự. Trang người đàn ông nêu rõ:

ln [TÙY CHỌN] ... [-T] TARGET LINK_NAME (mẫu thứ 1)


Nếu việc tìm kiếm hoặc đọc qua trang man mỗi lần không phải là dành cho bạn, có lẽ bạn sẽ dễ nhớ hơn rằng tất cả các lệnh nix đều hoạt động theo cùng một cách:

cp /file/that/exists /location/for/new/file
mv /file/that/exists /location/its/moving/to
ln /file/that/exists /the/new/link

cp sao chép một tệp hiện đang tồn tại (đối số thứ nhất) sang tệp mới (đối số thứ hai).
mv di chuyển một tệp hiện đang tồn tại (đối số thứ nhất) sang một vị trí mới (đối số thứ hai)

Tương tự như vậy lnliên kết một tệp hiện đang tồn tại (đối số đầu tiên) với một liên kết mới (đối số thứ hai) *


Tùy chọn cuối cùng tôi muốn đề xuất là bạn có thể tạo các trang người đàn ông của riêng bạn dễ đọc và dễ dàng (cho bạn) để tìm / ghi nhớ. Chỉ cần tạo một kịch bản shell đơn giản cung cấp cho bạn gợi ý bạn cần. Ví dụ :

Trong tệp .bash_aliases của bạn, bạn có thể đặt một cái gì đó như:

commandsfx() {
    echo "Symlink:  ln -s /path/to/file /path/to/symlink"
    echo "Copy:     cp /file/to/copy /destination/to/send/copy"
}

alias 'cmds'=commandsfx

Sau đó, khi bạn cần nó, từ dòng lệnh chỉ cần gõ cmdsvà bạn sẽ nhận lại cú pháp thích hợp theo cách bạn có thể nhanh chóng đọc và hiểu nó. Bạn có thể làm cho các chức năng này nâng cao như bạn muốn để có được thông tin bạn cần, tùy thuộc vào bạn. Bạn thậm chí có thể làm cho chúng tương tác để bạn chỉ cần làm theo lời nhắc .. đại loại như:

makesymlink() {
    echo "Symlink name:"
    read sym
    echo "File to link to:"
    read fil
    ln -s $fil $sym
}

alias 'symlink'=makesymlink

* - rõ ràng tất cả họ đều có thể lấy các tham số khác nhau và làm những việc khác nhau và có thể hoạt động trên các tệp cũng như thư mục ... nhưng tiền đề là như nhau
♦ - ví dụ sử dụng bash shell


18
ln [-Ffhinsv] source_file [target_file]

    link, ln -- make links

        -s    Create a symbolic link.

    A symbolic link contains the name of the file to which it is linked. 

    An ln command appeared in Version 1 AT&T UNIX.

16

Tạo liên kết tượng trưng hoặc liên kết mềm trên Linux:

Mở dấu nhắc Bash và gõ lệnh được đề cập bên dưới để tạo liên kết tượng trưng đến tệp của bạn:

A) Goto thư mục mà bạn muốn tạo một liên kết mềm và gõ lệnh như được đề cập dưới đây :

$ ln -s (path-to-file) (symbolic-link-to-file)
$ ln -s /home/user/file new-file

B) Goto đường dẫn tên tệp mới của bạn và loại :

$ ls -lrt (To see if the new-file is linked to the file or not)

Thí dụ:

user@user-DT:[~/Desktop/soft]# ln -s /home/user/Desktop/soft/File_B /home/user/Desktop/soft/File_C
user@user-DT:[~/Desktop/soft]# ls -lrt
total 0
-rw-rw-r-- 1 user user  0 Dec 27 16:51 File_B
-rw-rw-r-- 1 user user  0 Dec 27 16:51 File_A
lrwxrwxrwx 1 user user 31 Dec 27 16:53 File_C -> /home/user/Desktop/soft/File_B


Note: Where, File_C -> /home/user/Desktop/soft/File_B  Means, File_C is symbolically linked to File_B

12

ln -s sourcepath linkpathname

Ghi chú:

-s tạo liên kết tượng trưng thay vì liên kết cứng


11

Nếu bạn đang ở trong thư mục mà bạn muốn tạo symlink, thì hãy bỏ qua đường dẫn thứ hai.

cd myfolder
ln -s target

Nó sẽ tạo ra symlink của targetbên trong myfolder.

Cú pháp chung

ln -s TARGET LINK_NAME

11

Đây là Stack Overflow vì vậy tôi giả sử bạn muốn mã:

Tất cả các mã sau đây giả định rằng bạn muốn tạo một liên kết tượng trưng có tên /tmp/linklà liên kết đến /tmp/realfile.

THẬN TRỌNG : Mặc dù mã này kiểm tra lỗi, nhưng nó KHÔNG kiểm tra nếu /tmp/realfilethực sự tồn tại! Điều này là do liên kết chết vẫn còn hiệu lực và tùy thuộc vào mã của bạn, bạn có thể (hiếm khi) muốn tạo liên kết trước tệp thực.


Vỏ (bash, zsh, ...)

#!/bin/sh
ln -s /tmp/realfile /tmp/link

Thực sự đơn giản, giống như bạn sẽ làm nó trên dòng lệnh (đó là shell). Tất cả xử lý lỗi được thực hiện bởi trình thông dịch shell. Mã này giả định rằng bạn có một trình thông dịch shell làm việc tại/bin/sh .

Nếu cần bạn vẫn có thể thực hiện xử lý lỗi của riêng mình bằng cách sử dụng $? biến sẽ chỉ được đặt thành 0 nếu liên kết được tạo thành công.

C và C ++

#include <unistd.h>
#include <stdio.h>

int main () {
  if( symlink("/tmp/realfile", "/tmp/link") != 0 )
    perror("Can't create the symlink");
}

symlinkchỉ trả về 0 khi liên kết có thể được tạo. Trong các trường hợp khác tôi đang sử dụngperror để nói thêm về vấn đề.

Perl

#!/usr/bin/perl
if( symlink("/tmp/realfile", "/tmp/link") != 1) {
  print STDERR "Can't create the symlink: $!\n"
}

Mã này giả sử bạn có một trình thông dịch perl 5 tại /usr/bin/perl. symlinkchỉ trả về 1 nếu liên kết có thể được tạo. Trong các trường hợp khác, tôi đang in lý do lỗi cho đầu ra lỗi tiêu chuẩn.


1
Giải thích thêm, cũng là một lời cảnh báo cho các liên kết chết. Tôi không kiểm tra điều này, bởi vì không thể giả định rằng điều này là không muốn và cũng bởi vì các filetest không còn trong chủ đề
Garo

8

Tôi muốn trình bày một phiên bản tiếng Anh đơn giản hơn của các mô tả đã được trình bày.

 ln -s  /path-text/of-symbolic-link  /path/to/file-to-hold-that-text

Lệnh "ln" tạo ra một FILE liên kết và "-s" chỉ định rằng loại liên kết sẽ là biểu tượng. Có thể tìm thấy một ví dụ về tệp liên kết tượng trưng trong bản cài đặt WINE (sử dụng "ls -la" để hiển thị một dòng nội dung thư mục):

 lrwxrwxrwx 1 me power 11 Jan  1 00:01 a: -> /mnt/floppy

Công cụ thông tin tệp tiêu chuẩn nằm ở bên trái (mặc dù lưu ý rằng ký tự đầu tiên là "l" cho "liên kết"); tên tệp là "a:" và "->" cũng cho biết tệp là một liên kết. Về cơ bản, nó cho WINE biết Windows "Drive A:" được liên kết với ổ đĩa mềm trong Linux như thế nào. Để thực sự tạo một liên kết tượng trưng SIMILAR tới đó (trong thư mục hiện tại và để thực sự làm điều này cho WINE thì phức tạp hơn; sử dụng tiện ích "winecfg"):

 ln -s  /mnt/floppy  a:   //will not work if file a: already exists

7

Để tạo một liên kết tượng trưng / liên kết mềm, sử dụng:

ln -s {source-filename} {symbolic-filename}

ví dụ:

ln -s file1 link1

4

Có hai loại liên kết:

liên kết tượng trưng: Tham khảo đường dẫn biểu tượng cho biết vị trí trừu tượng của tệp khác

liên kết cứng: Tham khảo vị trí cụ thể của dữ liệu vật lý.

Trong trường hợp của bạn symlink:

ln -s source target

bạn có thể tham khảo http://man7.org/linux/man-pages/man7/symlink.7.html

bạn có thể tạo các liên kết quá khó

Một liên kết cứng đến một tập tin không thể phân biệt với mục nhập thư mục gốc; mọi thay đổi đối với tệp đều độc lập với tên được sử dụng để tham chiếu tệp. Liên kết cứng có thể thường không đề cập đến các thư mục và có thể không mở rộng hệ thống tập tin.

ln source link

4

Liên kết về cơ bản có hai loại:

Liên kết tượng trưng (mềm): liên kết đến đường dẫn biểu tượng cho biết vị trí trừu tượng của tệp khác

Liên kết cứng: liên kết đến vị trí cụ thể của dữ liệu vật lý.

Ví dụ 1:

ln /root/file1 /root/file2

Trên đây là một ví dụ về một liên kết cứng nơi bạn có thể có một bản sao dữ liệu vật lý của mình.

Ví dụ 2:

ln -s /path/to/file1.txt /path/to/file2.txt

Lệnh trên sẽ tạo một liên kết tượng trưng đến file1.txt.

Nếu bạn xóa một tệp nguồn thì bạn sẽ không có bất cứ điều gì đến đích.

Khi bạn làm:

ls -lai

Bạn sẽ thấy rằng có một số inode khác nhau cho các liên kết tượng trưng.

Để biết thêm chi tiết, bạn có thể đọc trang hướng dẫn của hệ điều hành Linux.


hard link where you can have a copy of your physical data- Tôi nghĩ chúng ta không tạo bản sao của dữ liệu vật lý. Chỉ cần một tên khác cho cùng một dữ liệu vật lý.
Alexander Radigan

3

Tôi tìm thấy một chút nhầm lẫn giữa các thuật ngữ "mục tiêu" và "thư mục" trong thông tin người đàn ông.

Mục tiêu là thư mục mà chúng tôi đang liên kết symlink và thư mục symlink thực tế (không phải thư mục mà bạn sẽ liên kết symlink), nếu bất cứ ai gặp phải sự nhầm lẫn tương tự, đừng cảm thấy cô đơn.

Đây là cách giải thích của tôi về việc tạo Symlink (trong linux):

ln -s /FULL/PATH/FOLDER-OR-FILE-SYMLINKING-TO NAME-OF-YOUR-SYMLINK

Bạn có thể điều hướng đến thư mục mà bạn muốn tạo symlink và chạy lệnh hoặc chỉ định FULL PATH cho liên kết tượng trưng của bạn thay vì NAME-OF-YOU-SYMLINK.

cd /FULL/PATH/TO/MY-SYMLINK-PARENT-FOLDER
ln -s /FULL/PATH/FOLDER-OR-FILE-SYMLINKING-TO NAME-OF-YOUR-SYMLINK

HOẶC LÀ

ln -s /FULL/PATH/FOLDER-OR-FILE-SYMLINKING-TO /FULL/PATH/TO/MY-SYMLINK-PARENT-FOLDER/NAME-OF-YOUR-SYMLINK

Tôi hy vọng điều này sẽ giúp những người (vẫn) hoàn toàn bối rối.


-2

Làm thế nào để tạo symlink trong vagrant. Các bước:

  1. Trong tập tin vagrant tạo một thư mục được đồng bộ hóa. ví dụ: cấu hình configm
  2. Vagrant up và gõ ssh vagrant và đi đến thư mục nguồn, ví dụ như nguồn cd
  3. Xác nhận cấu trúc thư mục mã nguồn của bạn có sẵn trong thư mục nguồn. ví dụ / nguồn / cục bộ
  4. Sau đó vào thư mục máy khách nơi chứa các tệp được liên kết với trình duyệt. Sau khi có được bản sao lưu của tập tin. ví dụ: sudo mv local local_bk
  5. Sau đó tạo symlink, ví dụ sudo ln -s / source / local local. tên liên kết trung bình cục bộ (tên thư mục trong máy khách mà bạn sẽ liên kết) nếu bạn cần xóa liên kết tượng trưng: - Nhập sudo rm local
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.