มีลิงก์สัญลักษณ์หลายระดับเกินไป


100

ฉันสร้างโครงสร้างไฟล์นี้:

test/src
test/firefox

เมื่อฉันเรียกใช้คำสั่งนี้:

ln -s test/src test/firefox

ฉันคาดว่าลิงก์สัญลักษณ์test/firefox/srcจะถูกสร้างขึ้นชี้ไปที่test/srcแต่ฉันได้รับข้อผิดพลาดนี้แทน:

-bash: cd: src: Too many levels of symbolic links
  • ผมทำอะไรผิดหรือเปล่า?
  • คุณไม่สามารถสร้างลิงก์สัญลักษณ์ไปยังโฟลเดอร์หนึ่งซึ่งเก็บไว้ในพี่น้องของโฟลเดอร์นั้นได้หรือไม่?
  • ประเด็นนี้คืออะไร?

ฉันไม่แน่ใจว่าฉันทำตามสิ่งที่คุณทำ โปรดโพสต์เอาต์พุตls -ld test test/*หรือลำดับของคำสั่งที่คุณรันเพื่อสร้างไฟล์เหล่านี้
Gilles

การทดสอบ mkdir; ทดสอบ mkdir / src; การทดสอบ mkdir / Firefox ln -s test / src test / firefox
David Zorychta

ด้วยคำสั่งเหล่านี้cd test/firefox/srcจะแสดงข้อผิดพลาดcd: no such file or directory: test/firefox/srcเนื่องจากtest/firefox/srcเป็นลิงค์สัญลักษณ์ห้อยต่องแต่ง คุณกำลังใช้cdลิงค์สัญลักษณ์อื่น ๆ ที่เรียกว่าsrc?
Gilles

ฉันแน่ใจว่าคุณทำบางสิ่งระหว่างln -sและcdคุณไม่ได้บอกเรา สมมติว่ามีเพียงtestไดเรกทอรีย่อยในไดเรกทอรีปัจจุบันของคุณcd src(หรือสิ่งที่คุณดำเนินการ) ควรจะเกิดข้อผิดพลาด คุณใส่อะไรลงไปtest/firefox?
Dubu

5
และเนื่องจาก @Gilles ให้คำใบ้ลิงก์นั้นจะไม่ทำในสิ่งที่คุณคิด ลิงก์สัญลักษณ์ที่มีเป้าหมายสัมพัทธ์จะสัมพันธ์กับไดเรกทอรี symlinkเสมอไม่ใช่ไดเรกทอรีที่คุณสร้างลิงก์นั้น ดังนั้นการอยู่ในไดเรกทอรี/some/pathที่ln -s test/src test/firefoxจะสร้าง symlink ชี้จาก/some/path/test/firefox/srcไป/some/path/test/firefox/test/src, ไม่ได้/some/path/test/srcไป
Dubu

คำตอบ:


32

บนพื้นผิวสิ่งที่คุณแนะนำให้คุณลองใช้กับฉัน

ตัวอย่าง

$ mkdir -p test/src test/firefox

$ tree --noreport -fp
.
`-- [drwxrwxr-x]  ./test
    |-- [drwxrwxr-x]  ./test/firefox
    `-- [drwxrwxr-x]  ./test/src

สร้างลิงก์สัญลักษณ์:

$ ln -s test/src test/firefox

$ tree --noreport -fp
.
`-- [drwxrwxr-x]  ./test
    |-- [drwxrwxr-x]  ./test/firefox
    |   `-- [lrwxrwxrwx]  ./test/firefox/src -> test/src
    `-- [drwxrwxr-x]  ./test/src

เรียกใช้เป็นครั้งที่ 2 โดยปกติแล้วจะสร้างสิ่งนี้:

$ ln -s test/src test/firefox
ln: failed to create symbolic link ‘test/firefox/src’: File exists

ดังนั้นคุณน่าจะมีอย่างอื่นเกิดขึ้นที่นี่ ฉันสงสัยว่าคุณมีการอ้างอิงแบบวงกลมที่มีลิงก์ชี้ไปที่ตัวมันเอง

คุณสามารถใช้findเพื่อจัดการเรื่องนี้สักหน่อย:

$ cd /suspected/directory
$ find -L ./ -mindepth 15

2
find -L ./ -mindepth 15เปิดเผยผู้กระทำผิด
user7610

167

เมื่อ Dubu แสดงความคิดเห็นปัญหาอยู่ในเส้นทางญาติของคุณ ผมมีปัญหาที่คล้ายกัน symlinking กำหนดค่า Nginx ของฉันจากไป/usr/local/etc/nginx /etc/nginxหากคุณสร้าง symlink ของคุณเช่นนี้:

cd /usr/local/etc
ln -s nginx/ /etc/nginx

ในความเป็นจริงคุณจะสร้างลิงก์ / etc / nginx -> / etc / nginx เนื่องจากเส้นทางต้นทางนั้นสัมพันธ์กับเส้นทางของลิงก์ วิธีแก้ปัญหานั้นง่ายเหมือนการใช้พา ธ สัมบูรณ์:

ln -s /usr/local/etc/nginx /etc/nginx

57
คำตอบนี้ชัดเจนกว่าคำตอบอื่น "ใช้พา ธ สัมบูรณ์"
wulftone

1
ผมสามารถยืนยันได้ว่านี้ทำงานให้ฉันบน Windows cygwinโดยใช้ ขอบคุณ!
dimiguel

ฉันมักจะมีปัญหาในการแก้ไขข้อโต้แย้ง บน OSX และ GNU Linux พวกเขาจะกลับรายการซึ่งทำให้ฉันสับสนมากยิ่งขึ้น
Daniel W.

ฉันยังไม่อยากจะเชื่อว่างานนี้
PNDA

5
คุณสามารถใช้การเชื่อมโยงญาติแต่พวกเขาควรจะอยู่บนพื้นฐานของไดเรกทอรีที่เชื่อมโยงสัญลักษณ์คือ กล่าวอีกนัยหนึ่ง: อาร์กิวเมนต์แรกควรเป็นแบบเดียวกันกับที่คุณจะเขียนหลังจากนั้นcdหากคุณต้องการไปยังไดเรกทอรีเป้าหมายจากไดเรกทอรีที่ไฟล์ลิงก์สัญลักษณ์เป็น
totymedli

9

Symlinks สัมพันธ์กับไดเรกทอรีหลักของลิงก์ไม่ใช่ของไดเรกทอรีปัจจุบันของlnกระบวนการ

เมื่อคุณทำ:

cd /top/dir
ln -s test/src test/firefox

(ที่test/firefoxเป็นไดเรกทอรี) คุณกำลังทำtest/firefox/srcsymlink test/srcซึ่งมีเป้าหมายเป็น

นั่นtest/srcคือเมื่อเทียบกับtest/firefoxไดเรกทอรีเพื่อให้เป็น symlink /top/dir/test/firefox/test/srcไป

หากคุณต้องการให้ symlink นั้นเป็นลิงก์ไปยัง/top/dir/test/srcคุณจะต้องเขียน:

ln -s ../src test/firefox/

หรือ

ln -s /top/dir/test/src test/firefox/

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

ด้วย GNU lnคุณสามารถใช้-rตัวเลือกเพื่อให้มันทำการคำนวณด้วยตัวเอง:

$ ln -rs test/src test/firefox/
$ ls -ld test/firefox/src
lrwxrwxrwx 1 chazelas chazelas 6 Nov 29 15:59 test/firefox/src -> ../src

5

ใช้เส้นทางสัมบูรณ์แทนเส้นทางสัมพัทธ์จากนั้นจะใช้งานได้

เช่น:

ln -s /home/user/test/src /home/user/test/firefox

0

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

ln -s "$(pwd)"/target abs/path/to/link 

หากลิงก์ของคุณควรอยู่ในไดเรกทอรีปัจจุบัน:

ln -s /abs/path/to/target "$(pwd)"
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.