Làm cách nào để tạo liên kết tượng trưng đến tất cả các tệp (lớp tệp) trong một thư mục?


37

Tôi muốn tạo các liên kết tượng trưng ( ln -s) đến tất cả các tệp (hoặc một lớp tệp, ví dụ: kết thúc bằng .bar) trong một thư mục nhất định. Nói rằng tôi đang ở cwd và gõ ls ../source/*.barcho tôi

foo.bar
baz.bar

Làm thế nào tôi có thể chuyển danh sách tham số đến ln -scuối cùng nó giải quyết

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

Tất nhiên tôi biết tôi có thể viết một kịch bản bash, nhưng nên có một cái gì đó đơn giản hơn liên quan xargshoặc vì nó dường như là một nhiệm vụ chung - ít nhất là đối với tôi.

Câu trả lời:


69

ln không có nhiều đối số, nhưng đừng quên đưa ra một thư mục đích trong trường hợp đó.

Vì vậy, trong ví dụ của bạn .là thư mục đích, vì vậy nó phải dễ như

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

Từ man ln; lệnh trên sử dụng mẫu thứ 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)
  • Ở dạng thứ 1, tạo liên kết đến TARGET với tên LINK_NAME.
  • Ở dạng thứ 2, tạo một liên kết đến TARGET trong thư mục hiện tại.
  • Trong biểu mẫu thứ 3 và thứ 4, tạo liên kết đến từng MỤC TIÊU trong TRỰC TIẾP.

5
Bạn vừa tiết kiệm cho tôi 5 phút vững chắc của cuộc đời tôi, đủ giá trị để dành một trong số họ để lại nhận xét. :-)
psychboom

Điều này không hoạt động nếu không có tập tin *.bar. Nó sẽ tạo ra một liên kết với tên "*.bar", đó không phải là những gì bạn muốn.
Nimrod

1
@Nimrod: Điều đó đúng, nhưng bạn có thể nói với bash rằng bạn muốn nó báo lỗi thay vì thông qua shopt -s failglob; xem ví dụ: unix.stackexchange.com/a/216227/33390 (Tương đương trong zshsetopt nomatch, được bật theo mặc định)
mpy

: vỗ tay: tốt đẹp!
Chris Schmitz

3

Sử dụng find

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

Ngoài ra, hãy nhớ sử dụng các đường dẫn đầy đủ (nếu có thể) với các liên kết tượng trưng.


2
Cảm ơn, nhưng không phải find $certainDir -name "*.bar" -exec ln -s {} \;sao? Và tại sao tôi nên sử dụng đường dẫn đầy đủ? Tôi thấy khá thuận tiện khi biết rằng các liên kết vẫn còn nguyên khi tôi di chuyển một cây thư mục xung quanh wihch có một số liên kết nội bộ.
dastrobu

Điều đó phụ thuộc vào nơi bạn muốn liên kết các thư mục. Và tôi không thể nhớ tại sao đường dẫn đầy đủ là một ý tưởng tốt, nó có thể là cho các liên kết cứng nhưng tôi đã đốt nó vào tâm trí của tôi vì một lý do. Hừm.
justbrowsing

Cảm ơn, câu trả lời của bạn là tuyệt vời. Vì câu trả lời của mpy là giải pháp đơn giản hơn cho câu hỏi, nên vấn đề thuộc về anh ấy / cô ấy. Tôi sẽ chấp nhận cả hai câu trả lời, nếu tôi có thể.
dastrobu

3

Bạn có thể thử đệ quy bằng cách sử dụng globalstar (bash / zsh được đặt bởi shopt -s globstar:):

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

Lưu ý: Đã thêm -vcho dài dòng.

Hoặc nếu danh sách quá dài, sử dụng findtiện ích:

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

Điều này sẽ tạo liên kết trong dest/hoặc thay đổi nó thành .thư mục hiện tại.


Câu thứ hai là câu trả lời đúng.
Nimrod

0

cpvới -stùy chọn có thể tạo ra một liên kết mềm (hoặc -lcho các liên kết cứng).

Từ thư mục hiện tại có thể được sử dụng như thế này:

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

Trong trường hợp của bạn, nó sẽ như thế này:

$ cp -s ../source/*.bar .
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.