it-swarm-vi.com

Làm thế nào tôi có thể "phát lại" rất nhiều symlink bị hỏng?

Tôi có một cây thư mục có một loạt các liên kết tượng trưng đến các tệp trong /home... tuy nhiên, tôi đã di chuyển /home đến /mnt/home và cần một cách để "phát lại" tất cả các liên kết tượng trưng. Có chức năng như vậy tồn tại hoặc tôi cần phải viết một kịch bản để làm như vậy?

Ví dụ, tôi có một cái gì đó như sau:

[[email protected] ~]# ls -l /mnt/home/someone/something
total 4264
lrwxrwxrwx 1 jnet www-data      55 2011-08-07 13:50 a -> /home/someone/someotherthing/a
lrwxrwxrwx 1 jnet www-data      55 2011-08-07 13:50 b -> /home/someone/someotherthing/b
lrwxrwxrwx 1 jnet www-data      55 2011-08-07 13:50 c -> /home/someone/someotherthing/c
lrwxrwxrwx 1 jnet www-data      55 2011-08-07 13:50 d -> /home/someone/someotherthing/d
lrwxrwxrwx 1 jnet www-data      55 2011-08-07 13:50 e -> /home/someone/someotherthing/e

/mnt/home/someone/something/subdir:
total 4264
lrwxrwxrwx 1 jnet www-data      55 2011-08-07 13:50 a -> /home/someone/someotherthing/subdir/a
lrwxrwxrwx 1 jnet www-data      55 2011-08-07 13:50 b -> /home/someone/someotherthing/subdir/b
lrwxrwxrwx 1 jnet www-data      55 2011-08-07 13:50 c -> /home/someone/someotherthing/subdir/c
lrwxrwxrwx 1 jnet www-data      55 2011-08-07 13:50 d -> /home/someone/someotherthing/subdir/d
lrwxrwxrwx 1 jnet www-data      55 2011-08-07 13:50 e -> /home/someone/someotherthing/subdir/e

Tôi muốn một lệnh sẽ tìm thấy tất cả các liên kết tượng trưng và chuyển đến cùng một nơi nhưng bên dưới /mnt/home thay vì /home

Liệu một lệnh như vậy tồn tại?

55
Josh

Không có lệnh để nhắm mục tiêu lại một liên kết tượng trưng, ​​tất cả những gì bạn có thể làm là loại bỏ nó và tạo một liên kết khác. Giả sử bạn có GNU tiện ích (ví dụ: trong Linux hoặc Cygwin không được nhúng), bạn có thể sử dụng -lname chính của find để khớp các liên kết tượng trưng theo mục tiêu của chúng và readlink để đọc nội dung của liên kết. Chưa được kiểm tra:

find /mnt/home/someone/something -lname '/home/someone/*' \
     -exec sh -c 'ln -snf "/mnt$(readlink "$0")" "$0"' {} \;

Nó sẽ là tốt hơn để làm cho các liên kết tượng trưng tương đối. Có một tiện ích nhỏ tiện lợi có tên symlinks (ban đầu bởi Mark Lords, hiện được J. Brandt Buckley duy trì), có mặt trong nhiều bản phân phối Linux. Trước khi di chuyển hoặc sau khi bạn đã khôi phục các liên kết hợp lệ như trên, hãy chạy symlinks -c /mnt/home/someone/something để chuyển đổi tất cả các liên kết tuyệt đối trong thư mục được chỉ định thành các liên kết tương đối trừ khi chúng vượt qua một ranh giới hệ thống tập tin.

Tôi biết đây không phải là chính xác những gì tác giả đang yêu cầu nhưng có vẻ như họ đã có câu trả lời của họ vì vậy tôi đang thêm điều này cho những người khác như tôi, người vấp phải câu hỏi.

Những điều sau đây sẽ giúp nếu cần một giải pháp linh hoạt hơn, chẳng hạn như có một loạt các liên kết tượng trưng bị hỏng có thể được sửa bằng cách thay thế một phần các mục tiêu của liên kết tượng trưng.

ví dụ. Sau khi thay đổi tên người dùng, để thay thế tên người dùng cũ bằng tên người dùng mới trong mục tiêu của nhiều liên kết, sau khi việc di chuyển đã được thực hiện. Tạo một tập lệnh gọi là thay thế-simlinks hiển thị bên dưới:

#!/bin/bash
link=$1
# grab the target of the old link
target=$(readlink -- "$1")

# replace the first occurrence of oldusername with newusername in the target string
target=${target/oldusername/newusername}

# Test the link creation
echo ln -s -- "$target" "$link"

# If the above echo shows the correct commands are being issued, then uncomment the following lines and run the command again
#rm "$link"
#ln -s "$target" "$link"

và gọi nó bằng lệnh sau:

find /home/newusername/ -lname '/home/oldusername/*' -exec ~/bin/replace-simlinks {} \;

Hy vọng điều này sẽ giúp ai đó

chỉnh sửa: Cảm ơn Gilles vì ​​đã khởi động tập lệnh này và lời khuyên về việc sử dụng tập lệnh symlink để làm cho các liên kết tương đối.

13
Gerry

Tạo nên /home như một liên kết tượng trưng đến /mnt/home và tất cả các liên kết tượng trưng hiện có sẽ hoạt động trở lại.

4
Keith Thompson