ฉันจะเชื่อมโยงไฟล์ใน Linux ได้อย่างไร [ปิด]


1939

ฉันต้องการสร้างลิงก์สัญลักษณ์ใน Linux ฉันได้เขียนคำสั่ง Bash นี้ที่เส้นทางแรกคือโฟลเดอร์ที่ฉันต้องการเชื่อมโยงและเส้นทางที่สองคือแหล่งที่รวบรวม

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

ถูกต้องหรือไม่


คุณควรถามคำถามนี้ที่unix.stackexchange.com
Guss

คำตอบ:


3677

ในการสร้าง symlink ใหม่ (จะล้มเหลวหาก symlink มีอยู่แล้ว):

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

ในการสร้างหรืออัพเดต symlink:

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

381
@micapam lnไวยากรณ์คล้ายกับcpไวยากรณ์เช่นแหล่ง ปลายทาง
Andrey

157
ต่อไปนี้เป็นตัวช่วยจำสำหรับคุณ: l (i) n (k) -s (ymbolic) <target> <optional name> (ความจริงที่ว่าพารามิเตอร์สุดท้ายเป็นทางเลือกจะช่วยให้คุณทราบว่าไม่ใช่เป้าหมาย) (btw ออกจาก เส้นทางไปยัง symlink สร้างลิงค์ในไดเรกทอรีปัจจุบันที่มีชื่อฐานเดียวกับเป้าหมาย)
UncleZeiv

32
@micapam เช่นเดียวกับcpเป็นCoPy, คือln LiNkตัวอักษรแรกและตัวที่สาม
โคลจอห์นสัน

68
ฉันใช้เวลาหลายนาทีพยายามคิดว่าทำไมมันถึงไม่เหมาะกับฉัน มันสร้างลิงค์วนลูปเอง ดูเหมือนว่าไฟล์ / path / to / ควรเป็นแบบสัมบูรณ์และไม่เกี่ยวข้องกับ "โฟลเดอร์ปัจจุบัน" อาจชี้ประเด็นนี้ในคำตอบ?
Abhishek Anand

52
@AbhishekAnand สองสามปีที่ผ่านมา แต่ฉันแค่อยากจะออกจากบันทึกว่ามันจะทำงานกับเส้นทางญาติ; มันเพียงแค่ต้องสัมพันธ์กับไดเรกทอรีของลิงก์สัญลักษณ์ผลลัพธ์ไม่ใช่ไดเรกทอรีปัจจุบัน สิ่งที่คุณเขียนในฐานะที่เป็นอาร์กิวเมนต์เส้นทางแรกคือคำต่อคำข้อความที่จะอยู่ในลิงค์สัญลักษณ์; นั่นเป็นเหตุผลว่าทำไมเมื่อมันสัมพันธ์กันมันจะต้องสัมพันธ์กับลิงค์
JoL

302
ln -s TARGET LINK_NAME

ที่-sทำให้มันเป็นสัญลักษณ์


2
TARGET & LINKNAMEเป็นวิธีที่ดีกว่าในการจดจำ btw สำหรับการลบการใช้ symlink:unlink LINK_NAME
Silvan

31
ฉันชอบที่จะพูดอย่างนี้: ln -s where-the-symlink-should-point where-to-place-the-symlink-itself.
totymedli

@Silvan คุณสามารถลบ symlink ผ่านแต่คนส่วนใหญ่ไม่ทราบว่าจะเอาต่อท้ายrm /
FreeSoftwareServers

288
ln -s EXISTING_FILE_OR_DIRECTORY SYMLINK_NAME

2
ดีกว่าคำตอบที่ได้รับการยอมรับและปกคลุมไปด้วยความกะทัดรัดที่ชัดเจน
Josh Habdas

3
ยกเว้นว่าไม่ใช่ชื่อ symlink ใหม่ มันเป็นชื่อหรือเส้นทางแบบเต็ม (เทียบกับ cur dir หรือสัมบูรณ์) สำหรับ symlink ใหม่รวมถึงชื่อ
David Spector

ln -s EXISTING_FILE_OR_DIRECTORY {พา ธ ตัวเลือกไปที่ /} SYMLINK_NAME และไม่ใส่เครื่องหมายทับต่อท้ายบน symlink เนื่องจากไม่ใช่ไดเรกทอรี
comfytoday


88

(เพราะภาพ ASCII มีค่าหนึ่งพันตัวอักษร)

ลูกศรอาจช่วยในการช่วยจำโดยเฉพาะอย่างยิ่งเนื่องจากเป็นลักษณะที่ปรากฏใน Emacs 'sired

และภาพรวมดังนั้นคุณจึงไม่สับสนกับเวอร์ชันของ Windows

ลินุกซ์:

ln -s target <- linkName

ของ windows:

mklink linkName -> target

คุณสามารถดูสิ่งเหล่านี้เป็น

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

from-hereไม่ควรอยู่ ๆ ก็จะถูกสร้างขึ้นในขณะที่to-hereควรมีอยู่แล้ว (IIRC)

(ฉันมักจะสับสนอยู่เสมอว่าคำสั่งและข้อโต้แย้งต่าง ๆ ควรเกี่ยวข้องกับตำแหน่งที่มีอยู่แล้วหรือจะสร้างขึ้นมาก่อน)

แก้ไข: มันยังคงจมช้าสำหรับฉัน; ฉันมีวิธีอื่นที่ฉันเขียนในบันทึกย่อของฉัน

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

ใน Emacs ' diredนั้นง่ายมากเมื่อคุณวางเคอร์เซอร์ไว้เหนือเป้าหมายกดSและพิมพ์ไดเรกทอรีที่คุณต้องการสร้างลิงก์ ลดระยะห่างระหว่างการจินตนาการผลลัพธ์ที่ต้องการและการพิมพ์ ดูgnu.org/software/emacs/manual/html_node/emacs/...
Brady Trainor

2
ตัวช่วยจำของฉันคือ ON: ln -s Original Newfile (symlink)
robstarbuck

สิ่งนี้ใช้ได้กับฉัน
Haider Ali


22

จากคำถามเดิม:


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

นี่จะเป็นการสร้างลิงก์สัญลักษณ์ ( -s) จากไฟล์ / ไดเรกทอรี:

<basebuild>/IpDome-kernel/kernel

ไปที่ลิงค์ใหม่ของคุณ

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

นี่เป็นวิธีที่จะช่วยคุณจดจำ:

แรกมีเป็นหน้าคนสำหรับ lnคุณสามารถเข้าถึงสิ่งนี้ผ่านการค้นหา "man ln" ใน google หรือเพียงแค่เปิดหน้าต่างเทอร์มินัลแล้วพิมพ์man lnและคุณจะได้รับข้อมูลเดียวกัน หน้าคนชัดเจนระบุ:

ln [OPTION] ... [-T] เป้าหมาย LINK_NAME (แบบฟอร์มที่ 1)


หากต้องค้นหาหรืออ่านหน้าคู่มือทุกครั้งไม่เหมาะกับคุณบางทีคุณอาจจำได้ง่ายขึ้นว่าคำสั่ง nixทั้งหมดทำงานในลักษณะเดียวกัน:

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

cp คัดลอกไฟล์ที่มีอยู่ในปัจจุบัน (อาร์กิวเมนต์แรก) ไปยังไฟล์ใหม่ (อาร์กิวเมนต์ที่สอง)
mv ย้ายไฟล์ที่มีอยู่ในปัจจุบัน (อาร์กิวเมนต์แรก) ไปยังตำแหน่งใหม่ (อาร์กิวเมนต์ที่สอง)

เช่นเดียวกันlnลิงก์ไฟล์ที่มีอยู่ในปัจจุบัน (อาร์กิวเมนต์แรก) ไปยังลิงก์ใหม่ (อาร์กิวเมนต์ที่สอง) *


ตัวเลือกสุดท้ายที่ฉันอยากจะแนะนำคือคุณสามารถสร้างหน้าคนของคุณเองที่ง่ายต่อการอ่านและง่าย (สำหรับคุณ) เพื่อค้นหา / จำ เพียงแค่สร้างเชลล์สคริปต์ง่ายๆที่ให้คำแนะนำที่คุณต้องการ ตัวอย่าง :

ในไฟล์. bash_aliases ของคุณคุณสามารถวางสิ่งที่ชอบ:

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

alias 'cmds'=commandsfx

จากนั้นเมื่อคุณต้องการจากบรรทัดคำสั่งเพียงพิมพ์cmdsและคุณจะได้รับไวยากรณ์ที่เหมาะสมกลับมาในแบบที่คุณสามารถอ่านและเข้าใจได้อย่างรวดเร็ว คุณสามารถทำให้ฟังก์ชั่นเหล่านี้เป็นขั้นสูงตามที่คุณต้องการที่จะได้รับสิ่งที่ข้อมูลที่คุณต้องการมันขึ้นอยู่กับคุณ คุณสามารถทำให้พวกมันเป็นแบบอินเทอร์แอกทีฟได้ดังนั้นคุณเพียงแค่ทำตามคำแนะนำ ..

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

alias 'symlink'=makesymlink

* - แน่นอนว่าพวกเขาทุกคนสามารถรับพารามิเตอร์ที่แตกต่างกันและทำสิ่งที่แตกต่างกันและสามารถทำงานกับไฟล์ได้เช่นเดียวกับไดเรกทอรี ... แต่หลักฐานนั้นเหมือนกัน
♦ - ตัวอย่างการใช้ 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

การสร้างลิงก์สัญลักษณ์หรือซอฟต์ลิงก์บน Linux:

เปิด Bash prompt แล้วพิมพ์คำสั่งที่ระบุไว้ด้านล่างเพื่อสร้างลิงก์สัญลักษณ์ไปยังไฟล์ของคุณ:

ก) ไปที่โฟลเดอร์ที่คุณต้องการสร้างซอฟต์ลิงค์และพิมพ์คำสั่งตามที่ระบุไว้ด้านล่าง :

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

B) ไปที่เส้นทางชื่อไฟล์ใหม่ของคุณและประเภท :

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

ตัวอย่าง:

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

บันทึก:

-ทำให้การเชื่อมโยงสัญลักษณ์แทนการเชื่อมโยงอย่างหนัก


11

หากคุณอยู่ในไดเร็กทอรีที่คุณต้องการสร้าง symlink ให้ข้ามพา ธ ที่สอง

cd myfolder
ln -s target

มันจะสร้าง symlink ของภายในtargetmyfolder

ไวยากรณ์ทั่วไป

ln -s TARGET LINK_NAME

11

นี่คือ Stack Overflow ดังนั้นฉันถือว่าคุณต้องการรหัส:

รหัสต่อไปนี้ทั้งหมดถือว่าคุณต้องการสร้างลิงก์สัญลักษณ์ที่ชื่อ/tmp/linkลิงก์/tmp/realfileนั้น

ข้อควรระวัง : แม้ว่ารหัสนี้จะตรวจสอบข้อผิดพลาด แต่ก็ไม่ได้ตรวจสอบว่า/tmp/realfileมีอยู่จริงหรือไม่! นี่เป็นเพราะการเชื่อมโยงที่ตายแล้วยังคงใช้ได้และขึ้นอยู่กับรหัสของคุณคุณอาจ (ไม่ค่อย) ต้องการสร้างลิงค์ก่อนที่ไฟล์จริง


เชลล์ (bash, zsh, ... )

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

ง่ายจริง ๆ เหมือนกับที่คุณทำบนบรรทัดคำสั่ง (ซึ่งเป็นเชลล์) การจัดการข้อผิดพลาดทั้งหมดทำโดยตัวแปลเชลล์ รหัสนี้อนุมานว่าคุณมีล่ามเชลล์ที่ใช้งาน/bin/shได้ที่

หากจำเป็นคุณยังสามารถใช้การจัดการข้อผิดพลาดของคุณเองโดยใช้$?ตัวแปรซึ่งจะถูกตั้งค่าเป็น 0 เท่านั้นหากลิงก์ถูกสร้างสำเร็จ

C และ C ++

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

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

symlinkส่งกลับค่า 0 เท่านั้นเมื่อสามารถสร้างลิงก์ได้ ในกรณีอื่นฉันใช้perrorเพื่อบอกเพิ่มเติมเกี่ยวกับปัญหา

Perl

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

รหัสนี้จะถือว่าคุณมี Perl 5 /usr/bin/perlล่ามที่ symlinkส่งคืน 1 เท่านั้นหากสามารถสร้างลิงก์ได้ ในกรณีอื่นฉันกำลังพิมพ์สาเหตุของความล้มเหลวไปยังเอาต์พุตข้อผิดพลาดมาตรฐาน


1
เพิ่มคำอธิบายยังเป็นคำเตือนสำหรับลิงก์ที่ไม่ทำงาน ฉันไม่ได้ตรวจสอบสิ่งนี้เพราะมันไม่สามารถคาดเดาได้ว่าสิ่งนี้ไม่ต้องการและเพราะการทดสอบไฟล์ไม่ได้อยู่ในหัวข้ออีกต่อไป
Garo

8

ฉันต้องการนำเสนอคำอธิบายเวอร์ชันที่ชัดเจนขึ้นเป็นภาษาอังกฤษแล้ว

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

คำสั่ง "ln" สร้าง link-FILE และ "-s" ระบุว่าประเภทของลิงก์จะเป็นสัญลักษณ์ ตัวอย่างของไฟล์ symbolic-link สามารถพบได้ในการติดตั้ง WINE (โดยใช้ "ls -la" เพื่อแสดงเนื้อหาไดเรกทอรีหนึ่งบรรทัด):

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

ข้อมูลไฟล์ข้อมูลมาตรฐานอยู่ทางซ้าย (แม้ว่าข้อความตัวแรกจะเป็น "l" สำหรับ "ลิงค์"); ชื่อไฟล์คือ "a:" และ "->" ยังระบุว่าไฟล์เป็นลิงค์ โดยพื้นฐานแล้วมันบอก WINE ว่า Windows "Drive A:" เกี่ยวข้องกับฟลอปปี้ไดรฟ์ใน Linux อย่างไร ในการสร้างลิงค์สัญลักษณ์ที่คล้ายกัน (ในไดเรกทอรีปัจจุบันและการทำเช่นนี้สำหรับ WINE นั้นซับซ้อนกว่านั้นให้ใช้ยูทิลิตี้ "winecfg"):

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


4

มีลิงก์สองประเภท:

ลิงก์สัญลักษณ์: อ้างถึงเส้นทางสัญลักษณ์ที่ระบุตำแหน่งนามธรรมของไฟล์อื่น

ฮาร์ดลิงก์: อ้างถึงตำแหน่งเฉพาะของข้อมูลทางกายภาพ

ในกรณีที่คุณเชื่อมโยง:

ln -s source target

คุณสามารถอ้างถึงhttp://man7.org/linux/man-pages/man7/symlink.7.html

คุณสามารถสร้างลิงค์ยากเกินไป

ฮาร์ดลิงก์ไปยังไฟล์นั้นแยกไม่ออกจากรายการไดเรกทอรีดั้งเดิม การเปลี่ยนแปลงใด ๆ กับไฟล์นั้นไม่ขึ้นกับชื่อที่ใช้ในการอ้างอิงไฟล์ ฮาร์ดลิงก์อาจไม่อ้างอิงไดเรกทอรีและอาจไม่ครอบคลุมระบบไฟล์

ln source link

4

ลิงก์นั้นเป็นสองประเภท:

ลิงก์สัญลักษณ์ (อ่อน): ลิงก์ไปยังพา ธ สัญลักษณ์ที่ระบุตำแหน่งนามธรรมของไฟล์อื่น

ฮาร์ดลิงก์: ลิงค์ไปยังตำแหน่งเฉพาะของข้อมูลทางกายภาพ

ตัวอย่างที่ 1:

ln /root/file1 /root/file2

ด้านบนเป็นตัวอย่างของฮาร์ดลิงก์ที่คุณสามารถคัดลอกข้อมูลทางกายภาพของคุณได้

ตัวอย่างที่ 2:

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

คำสั่งดังกล่าวจะสร้างลิงค์สัญลักษณ์ไปที่ file1.txt

หากคุณลบไฟล์ต้นฉบับคุณจะไม่มีสิ่งใดไปยังปลายทางอย่างนุ่มนวล

เมื่อคุณทำ:

ls -lai

คุณจะเห็นว่ามีหมายเลขไอโหนดที่แตกต่างกันสำหรับ symlink

สำหรับรายละเอียดเพิ่มเติมคุณสามารถอ่าน man page ของ ln บน Linux OS ของคุณ


hard link where you can have a copy of your physical data- ฉันคิดว่าเราไม่ได้สร้างสำเนาข้อมูลทางกายภาพ เพียงชื่ออื่นสำหรับข้อมูลทางกายภาพเดียวกัน
Alexander Radchenko

3

ฉันพบว่าคำศัพท์ "เป้าหมาย" และ "ไดเรกทอรี" สับสนในข้อมูลของคน

เป้าหมายคือโฟลเดอร์ที่เรากำลังเชื่อมโยงไปถึงและไดเรกทอรีเป็น symlink จริง (ไม่ใช่ไดเรกทอรีที่คุณจะเชื่อมโยงไปถึง) หากใครก็ตามกำลังประสบกับความสับสนเดียวกันอย่ารู้สึกเหงา

นี่คือการตีความของฉันในการสร้าง Symlink (ใน linux):

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

คุณสามารถนำทางไปยังโฟลเดอร์ที่คุณต้องการสร้าง symlink และรันคำสั่งหรือระบุเส้นทางแบบเต็มสำหรับ symlink ของคุณแทน NAME-OF-YOUR-SYMLINK

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

หรือ

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

ฉันหวังว่านี่จะช่วยผู้ที่สับสนเล็กน้อย


-2

วิธีการสร้าง symlink ในคนเร่ร่อน ขั้นตอน:

  1. ในไฟล์คนจรจัดสร้างโฟลเดอร์ที่ซิงค์ เช่น config.vm.synced_folder "F: / Sunburst / source / sunburst / lms", "/ source" F: / Sunburst / source / sunburst / lms: - ที่ซอร์สโค้ด / ซอร์ส: - พา ธ ของไดเร็กทอรีภายใน vagrant
  2. คนจรจัดขึ้นและพิมพ์คนตกปลา ssh และไปที่ไดเรกทอรีแหล่งเช่นแหล่งซีดี
  3. ตรวจสอบว่าโครงสร้างโฟลเดอร์ซอร์สโค้ดของคุณนั้นมีอยู่ในไดเรกทอรีต้นทาง เช่น / source / local
  4. จากนั้นไปที่ไดเรคทอรี guest machine ซึ่งเป็นไฟล์ที่เชื่อมโยงกับเบราว์เซอร์ หลังจากได้รับการสำรองไฟล์ เช่น sudo mv local_bk ท้องถิ่น
  5. จากนั้นสร้าง symlink เช่น sudo ln -s / source / local local local-link-name (ชื่อโฟลเดอร์ในเครื่องแขกที่คุณกำลังจะลิงค์) หากคุณต้องการลบ symlink: - พิมพ์ sudo rm local
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.