LINUX: Liên kết tất cả các tệp từ thư mục này sang thư mục khác [đã đóng]


123

Tôi muốn liên kết ( ln -s) tất cả các file có trong /mnt/usr/lib/thành/usr/lib/

Có rất nhiều tập tin, làm thế nào nó có thể được thực hiện nhanh chóng? :)


Có bao nhiêu tệp là "rất nhiều" và tốc độ bạn cho là "nhanh" như thế nào?
Eric Smith

4
Đây là 50:50 cho dù nó phù hợp với "serverfault" hay "superuser", nhưng nó không phải là lập trình, vì vậy không phải cho stackoverflow.
Marc Gravell

Câu trả lời:


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

Tôi đoán, điều này thuộc về siêu người dùng, mặc dù.


6
Điều này không bao gồm các tập tin ẩn, và nó liên kết toàn bộ thư mục. Nếu một trong hai điều này không phải là điều bạn muốn, hãy xem câu trả lời của tôi. Mặt khác, đó là con đường ngắn nhất.
Cascabel

Bạn đúng. Nhưng các thư viện thường không được ẩn. Trong mọi trường hợp, dotfiles có liên quan đến giải pháp của bạn trở nên tiện dụng hơn.

1
nó sẽ trỏ đến thư mục khác vĩnh viễn?
nmkyuppie

@YuPPie Tôi đoán, nó chỉ tạo liên kết cứng đến mọi tệp trong thư mục. (đây là những gì tôi muốn ngày hôm nay, vì vậy +1: D)
Tên hiển thị

2
@SargeBorsch Nó tạo ra các liên kết tượng trưng (liên kết cứng là khác nhau).
jsejcksn

90

GNU cpcó một tùy chọn để tạo liên kết tượng trưng thay vì sao chép.

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

Lưu ý đây là phần mở rộng GNU không tìm thấy trong POSIXcp .


4
Thư mục hiện tại của bạn phải là / usr / để tạo liên kết tượng trưng theo cách này
Soul_man

@caf Nếu đích là thư mục hiện có, thì thư mục lib được tạo bên trong thư mục / usr /
Tamil Selvan C

2
Câu trả lời tốt. Cũng có thể được sử dụng để tạo liên kết cứng với -l thay vì -s.
Fax


15

Các giải pháp được đăng sẽ không liên kết bất kỳ tập tin ẩn. Để bao gồm chúng, hãy thử điều này:

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

Nếu bạn tình cờ muốn tạo đệ quy các thư mục và chỉ các tệp liên kết (để nếu bạn tạo một tệp trong một thư mục, nó thực sự /usr/libkhông ở trong đó /mnt/usr/lib), bạn có thể làm điều này:

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
Tôi tin rằng điều này cũng sẽ hoạt động như một cách để ký tự đại diện trong các tệp ẩn, nếu bạn đã mở rộng toàn cầu hóa trong bash. Nó khớp với tất cả mọi thứ bắt đầu bằng một dấu chấm, tiếp theo là một thứ gì đó không phải là gì hoặc một dấu chấm khác (nghĩa là nó loại trừ ./../):ln -s /mnt/usr/lib/.!(|.)* /usr/lib
Cascabel
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.