Sử dụng `ln` để tạo một thư mục bị thiếu


10

Vì vậy, tôi đang viết một trình quản lý gói nhỏ và một vấn đề tôi gặp phải là tạo các liên kết tượng trưng đến các tệp.

Nó cài đặt gói đến /usr/pkg/name-versionvà sau đó đọc một tệp để xác định các liên kết tượng trưng để thực hiện. Tôi đang sử dụng lnđể tạo các liên kết và tôi gặp phải sự cố khi cố gắng cài đặt các tiêu đề API Linux. Tôi cần tự liên kết các tệp tiêu đề, không phải các thư mục chứa chúng (vì vậy nếu 2 gói cần đặt các tệp trong cùng một thư mục con bao gồm chúng có thể mà không cần vặn một gói lên).

Vấn đề đó tôi đã giải quyết, nhưng lnchỉ đơn giản là lỗi nếu đường dẫn không đầy đủ, điều này gây khó chịu vì những thư mục đó không nên tồn tại cho đến khi gói được cài đặt.

Có một lá cờ cho lnđiều đó sẽ tạo ra bất kỳ thư mục bị thiếu, hoặc tôi sẽ phải đi với một số tập lệnh bash phức tạp?


1
Tôi có thể đang thiếu một cái gì đó rõ ràng, nhưng tại sao bạn không sử dụng mkdirđể ... tạo thư mục?
jw013

Bạn cũng có thể muốn kiểm tra lndir.
am

Câu trả lời:


3

Bạn sẽ không cần một tập lệnh bash phức tạp, nhưng một tập lệnh đơn giản. mkdir --parentssẽ xử lý tất cả mọi thứ, thậm chí không in lỗi nếu cấu trúc thư mục đã tồn tại.

Chỉ cần cẩn thận với cách bạn xử lý các thư mục này khi xóa, vì vậy bạn không phá vỡ các gói khác.

Ngoài ra, vì bạn đang viết nó vào bash, bạn có thể xem phép thuật (phích cắm không biết xấu hổ). Có lẽ sẽ đơn giản hơn nếu chỉ sửa đổi điều đó, vì nó trưởng thành và linh hoạt.


Rất tiếc, tôi đã quên đề cập rằng tôi đang viết nó bằng c ++ và can thiệp bash với các cuộc gọi system () vì nó dễ hơn. Đây là những gì tôi đã làm mặc dù, cảm ơn.
Chris

@Chris: system()không dễ hơn, rất khó thoát khỏi các đối số dòng lệnh system(). Ít nhất bạn nên sử dụng posix_spawn()hoặc fork()+exec*(), chấp nhận các đối số dòng lệnh dưới dạng mảng.
Nói dối Ryan

4

Không có cờ để làm điều này với ln. Tạo thư mục không phải là công việc của nó.

mkdir -p foo/bar/quxsẽ tạo ra foo, foo/barfoo/bar/quxkhi cần thiết. Vì vậy, gọi mkdir -ptất cả nhưng thành phần đường dẫn cuối cùng đầu tiên.

Có vẻ như bạn đang phát minh lại bánh xe Stow , một trình quản lý gói đơn giản hợp nhất các cấu trúc phân cấp thư mục bằng cách tạo các thư mục đến độ sâu cần thiết với các liên kết tượng trưng đến các thành phần của các gói khác nhau bên trong. Hoặc có lẽ XStow , giống như Stow nhưng có nhiều khả năng tùy biến hơn.


0

Có lẽ tarcó thể giúp chuẩn bị các tập tin với các liên kết:

find . -type l > links.txt
tar cpf links.tar --files-from links.txt

Và sau đó để tạo các liên kết khi cần thiết:

tar xvf links.tar
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.