LINUX: เชื่อมโยงไฟล์ทั้งหมดจากที่หนึ่งไปยังไดเร็กทอรีอื่น [ปิด]


123

ฉันต้องการที่จะเชื่อมโยง ( ln -s) ไฟล์ทั้งหมดที่อยู่ใน/mnt/usr/lib/เข้าไป/usr/lib/

มีไฟล์จำนวนมากจะทำได้เร็วแค่ไหน? :)


"จำนวนมาก" มีกี่ไฟล์และคุณคิดว่า "เร็ว" แค่ไหน?
Eric Smith

4
นี่คือ 50:50 ไม่ว่าจะพอดีกับ "serverfault" หรือ "superuser" แต่ไม่ใช่การเขียนโปรแกรมดังนั้นไม่ใช่สำหรับ stackoverflow
Marc Gravell

คำตอบ:


202
ln -s /mnt/usr/lib/* /usr/lib/

ฉันเดาว่านี่เป็นของ superuser แม้ว่า


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

คุณถูก. แต่โดยปกติแล้วไลบรารีจะไม่ถูกซ่อน ไม่ว่าในกรณีใดก็ตามที่เกี่ยวข้องกับ dotfiles โซลูชันของคุณก็มีประโยชน์มากขึ้น

1
จะชี้ไปที่โฟลเดอร์อื่นอย่างถาวรหรือไม่
nmkyuppie

@YuPPie ฉันเดาว่ามันสร้างฮาร์ดลิงค์ไปยังทุกไฟล์ในไดเร็กทอรี (นี่คือสิ่งที่ฉันต้องการในวันนี้ดังนั้น +1: D)
ชื่อที่แสดง

2
@SargeBorsch มันสร้างลิงค์สัญลักษณ์ (ฮาร์ดลิงค์ต่างกัน)
jsejcksn

90

GNU cpมีตัวเลือกในการสร้างลิงก์สัญลักษณ์แทนการคัดลอก

cp -rs /mnt/usr/lib /usr/

หมายเหตุนี้เป็นส่วนขยายของ GNU ไม่พบใน cpPOSIX


4
ไดเรกทอรีปัจจุบันของคุณควรเป็น / usr / เพื่อสร้างลิงก์สัญลักษณ์ด้วยวิธีนี้
Soul_man

@caf หากปลายทางเป็นโฟลเดอร์ที่มีอยู่โฟลเดอร์ lib จะถูกสร้างขึ้นภายใน / usr / โฟลเดอร์
Tamil Selvan C

2
คำตอบที่ดี. ยังสามารถใช้เพื่อสร้างฮาร์ดลิงก์ด้วย -l แทน -s
แฟกซ์


15

โซลูชันที่โพสต์จะไม่เชื่อมโยงไฟล์ที่ซ่อนอยู่ หากต้องการรวมไว้ให้ลองทำสิ่งนี้:

cd /usr/lib
find /mnt/usr/lib -maxdepth 1 -print "%P\n" | while read file; do ln -s "/mnt/usr/lib/$file" "$file"; done

หากคุณต้องการสร้างไดเร็กทอรีซ้ำและลิงก์ไฟล์เท่านั้น (ดังนั้นหากคุณสร้างไฟล์ภายในไดเร็กทอรีมันจะ/usr/libไม่อยู่ในนั้นจริงๆ/mnt/usr/lib) คุณสามารถทำได้:

cd /usr/lib
find /mnt/usr/lib -mindepth 1 -depth -type d -printf "%P\n" | while read dir; do mkdir -p "$dir"; done
find /mnt/usr/lib -type f -printf "%P\n" | while read file; do ln -s "/mnt/usr/lib/$file" "$file"; done

2
ฉันเชื่อว่าสิ่งนี้ควรใช้เป็นวิธีในการใช้สัญลักษณ์แทนในไฟล์ที่ซ่อนอยู่หากคุณเปิดใช้งาน globbing แบบขยายใน bash มันจับคู่ทุกอย่างที่เริ่มต้นด้วยจุดตามด้วยสิ่งอื่นที่ไม่ใช่อะไรหรือจุดอื่น (เช่นมันไม่รวม./และ../):ln -s /mnt/usr/lib/.!(|.)* /usr/lib
Cascabel
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.