tra-loi-cau-hoi-phat-trien-web.com

Làm cách nào để liên kết một tệp trong Linux?

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?

1766
chrissygormley

Để tạo một liên kết tượng trưng 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
3444
hsz
ln -s TARGET LINK_NAME

Trong đó -s làm cho nó mang tính biểu tượng.

278
cyborg
ln -s EXISTING_FILE_OR_DIRECTORY SYMLINK_NAME
268
codaddict
ln -s target linkName

Bạn có thể xem trang người đàn ông ở đây:

http://linux.die.net/man/1/ln

88
rui

(Vì một hình ảnh ASCII có giá trị bằng một nghì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"

from-here chưa tồn tại, nó sẽ được tạo, trong khi to-here đã tồn tại (IIRC).

(Tôi luôn bị lẫn lộn về việc 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)
78
Brady Trainor
ln -s source_file target_file

http://unixhelp.ed.ac.uk/CGI/man-cgi?ln

24
Rob M

Đố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 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 man cho ln . Bạn có thể truy cập thông qua tìm kiếm "man ln" trong google hoặc chỉ cần mở cửa sổ đầu cuối và nhập man ln và 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ù hợp với bạn, có thể bạn sẽ dễ nhớ hơn khi tất cả các lệnh nix 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 một tệp mới (đối số thứ hai) . 
[.__.] mv di chuyển tệp hiện đang tồn tại (đối số thứ nhất) sang vị trí mới (đối số thứ hai)

[.__.] Tương tự như vậy ln liên kết một tệp hiện đang tồn tại (đối số thứ nhất) 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õ cmds và 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ể làm việc 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

17
Mike
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
miku

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

Mở Bash Prompt 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 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 và tên tệp mới của bạn :

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

Thí dụ:

ls -lrt

lrwxrwxrwx 1 user user 24 Aug 6 23:40 new-file -> /home/user/file

Note: Where, A -> B Means, A is symbolically linked to B

12
Ankit Raj

ln -s sourcepath linkpathname

Chú thích:

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

11
simranjeet

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 liên kết tượng trưng của target bên trong myfolder.

Cú pháp chung

ln -s TARGET LINK_NAME
10
Fizer Khan

Đâ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/link 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 xem /tmp/realfile có thực sự tồn tại không! Đ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 điều đó 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ó trình thông dịch Shell hoạt động 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");
}

symlink chỉ 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ụng perror để 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ó trình thông dịch Perl 5 tại /usr/bin/Perl. symlink chỉ 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.

9
Garo

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 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
vernonner3voltazim

Để 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
6
Prem S

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 hiệu quả 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.

ln source link
3
wpp

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 liên kết tượng trưng 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

OR

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
mmmdearte

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 một đườ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ề 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 hơn bạn sẽ không có gì đến đích trong Soft

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 man of ln trên hệ điều hành linux của bạn.

Cảm ơn

2
Prabhat Singh