จะสร้างลิงค์สัญลักษณ์ไปยังไฟล์ทั้งหมด (คลาสของไฟล์) ในไดเรกทอรีได้อย่างไร?


43

ฉันต้องการสร้างลิงก์สัญลักษณ์ ( ln -s) ไปยังไฟล์ทั้งหมด (หรือคลาสของไฟล์เช่นลงท้ายด้วย.bar) ในไดเรกทอรีหนึ่ง บอกว่าฉันอยู่ใน cwd และประเภทls ../source/*.barให้ฉัน

foo.bar
baz.bar

ฉันจะส่งรายการพารามิเตอร์ไปยังวิธีการln -sที่จะแก้ไขในที่สุด

ln -s ../source/foo.bar
ln -s ../source/baz.bar

แน่นอนฉันรู้ว่าฉันสามารถเขียนสคริปต์ทุบตีได้ แต่ควรมีบางอย่างที่เกี่ยวข้องกับเรื่องนี้ง่ายกว่าxargsเนื่องจากเป็นงานทั่วไป - อย่างน้อยก็สำหรับฉัน

คำตอบ:


75

ln ใช้อาร์กิวเมนต์หลายตัว แต่อย่าลืมระบุไดเรกทอรีเป้าหมายในกรณีนั้น

ดังนั้นในตัวอย่างของคุณ.คือไดเรกทอรีเป้าหมายดังนั้นควรเป็นเรื่องง่ายเหมือน

ln -s ../source/*.bar .

จากman ln; คำสั่งข้างต้นใช้รูปแบบที่ 3:

ln [OPTION]... [-T] TARGET LINK_NAME   (1st form)
ln [OPTION]... TARGET                  (2nd form)
ln [OPTION]... TARGET... DIRECTORY     (3rd form)
ln [OPTION]... -t DIRECTORY TARGET...  (4th form)
  • ในฟอร์มที่ 1 ให้สร้างลิงก์ไปยัง TARGET ด้วยชื่อ LINK_NAME
  • ในฟอร์มที่ 2 ให้สร้างลิงก์ไปยัง TARGET ในไดเรกทอรีปัจจุบัน
  • ในรูปแบบที่ 3 และ 4 ให้สร้างลิงก์ไปยังแต่ละเป้าหมายใน DIRECTORY

5
คุณเพิ่งช่วยชีวิตฉันได้ 5 นาทีคุ้มค่าพอที่จะใช้ความคิดเห็นใดข้อหนึ่ง :-)
moodboom

*.barนี้จะไม่ทำงานถ้าไม่มีไฟล์ มันจะสร้างลิงก์ที่มีชื่อ"*.bar"ซึ่งไม่ใช่สิ่งที่คุณต้องการ
Nimrod

1
@Nimrod: จริง แต่คุณสามารถบอกทุบตีว่าคุณต้องการรายงานข้อผิดพลาดแทนผ่านshopt -s failglob; ดูเช่นunix.stackexchange.com/a/216227/33390 (เทียบเท่าในzshคือsetopt nomatchซึ่งจะเปิดตามค่าเริ่มต้น)
mpy

: ปรบมือ: ดี!
Chris Schmitz

3

ใช้ find

certainDir="/path/to/dir"
find -name "*.bar" -exec ln -s {} "$certainDir" \;

นอกจากนี้อย่าลืมใช้เส้นทางแบบเต็ม (มากที่สุด) ด้วย symlinks


2
ขอบคุณ แต่ไม่ใช่find $certainDir -name "*.bar" -exec ln -s {} \;เหรอ และทำไมฉันต้องใช้เส้นทางแบบเต็ม? ฉันคิดว่ามันค่อนข้างสะดวกที่จะรู้ว่าลิงก์ยังคงเหมือนเดิมเมื่อฉันย้ายแผนผังไดเรกทอรีรอบ ๆ wihch มีลิงค์ภายในอยู่บ้าง
dastrobu

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

ขอบคุณคำตอบของคุณยอดเยี่ยม เนื่องจากคำตอบของ mpy นั้นเป็นคำตอบที่ง่ายกว่าสำหรับคำถามประเด็นนั้นจึงไปที่เขา / เธอ ฉันจะยอมรับทั้งสองคำตอบถ้าทำได้
dastrobu

3

คุณสามารถลองวนซ้ำโดยใช้ globstar (bash / zsh ที่กำหนดโดย:) shopt -s globstar:

ls -vs ../**/*.bar .

หมายเหตุ: เพิ่ม-vสำหรับ verbose

หรือถ้ารายการยาวเกินไปให้ใช้findยูทิลิตี้:

find .. -name \*.bar -exec ln -vs "{}" dest/ ';'

สิ่งนี้จะสร้างลิงค์dest/หรือเปลี่ยนเป็น.โฟลเดอร์ปัจจุบัน


คำตอบที่สองคือคำตอบที่ถูกต้อง
Nimrod

0

cpด้วย-sตัวเลือกสามารถสร้างลิงค์นุ่ม ๆ (หรือ-lสำหรับฮาร์ดลิงก์)

จากไดเรกทอรีปัจจุบันสามารถใช้ดังนี้:

$ cp -s ../path/with/scripts/* .

ในกรณีของคุณมันจะเป็นเช่นนี้:

$ cp -s ../source/*.bar .
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.