Chuyển đổi liên kết tượng trưng thành liên kết cứng


25

Tôi muốn chuyển đổi đệ quy các liên kết mềm thành các liên kết cứng trong một thư mục. Tôi đã thử một cái gì đó như thế này:

for f in *; do (mv $f{,~} && ln $(readlink $f~) && rm $f~) done

Tuy nhiên, nó có hai vấn đề lớn:

  • không đệ quy
  • chọn các tập tin không phải là liên kết tượng trưng

Sẽ tốt hơn nếu bằng cách nào đó cung cấp dòng trên find -type l, nhưng tôi không chắc làm thế nào để làm điều đó.


1
Xem thêm [thảo luận này] [1] ( cp -aH). [1]: unix.stackexchange.com/questions/94185/ dọa
Michael Shigorin

Câu trả lời:


34

Lệnh này sẽ hoạt động:

find -type l -exec bash -c 'ln -f "$(readlink -m "$0")" "$0"' {} \;

Làm thế nào nó hoạt động:

  • find -type l tìm thấy tất cả các liên kết trong thư mục hiện tại.

  • -exec bash -c '...' {} \;gọi bash để thực thi ....

    Nó vượt qua {}- tên của liên kết hiện đang được xử lý - như là một đối số, mà bash có thể truy cập dưới dạng $0.

  • readlink -m "$0" trả về đường dẫn tuyệt đối của đích đến của liên kết tượng trưng.

  • ln -f "$(readlink -m "$0")" "$0"ghi đè ( -f) liên kết tượng trưng $0với một liên kết cứng đến mục tiêu của nó.

Nếu một số lý do liên kết không thể được chuyển đổi, nó sẽ không bị ảnh hưởng và ln sẽ in một thông báo lỗi.


Về đoạn cuối đó, nó có đủ để chỉ định các đường dẫn tuyệt đối đến bashlnkhông?
Daniel Beck

2
Vấn đề của tôi là readlink trả về một đường dẫn tương đối theo mặc định, nhưng công -etắc đã sửa nó.
Dennis

Điều gì sẽ là lệnh cho OSX?
Igor Markelov

@IgorMarkelov Tôi xin lỗi, nhưng tôi không biết gì về OSX.
Dennis

1
Trên máy Mac, nó là: brew install coreutilsfind * -type l -exec bash -c 'ln -f "$(greadlink -m "$0")" "$0"' {} \;.
Igor Markelov
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.