Có cách nào để diễn đạt: `--link` hoặc quay lại bản sao thông thường trong cp (từ GNU coreutils) không?


11

Có cách nào để nói cpvới --link(tức là tạo liên kết cứng), nhưng lại rơi vào trường hợp tôi đang cố gắng liên kết cứng giữa các thiết bị? Liên kết giữa các thiết bị không thể thực hiện được và sẽ gây ra cplỗi.

Lý do tôi hỏi là vì tôi muốn sử dụng nó trong một GNUmakefilevà muốn một dòng lệnh có thể đọc được hơn một số dòng dài và phức tạp (hoặc một hàm, cho vấn đề đó).

Câu hỏi dành cho lõi core GNU (7.4 và 8.13).

Lưu ý: ngay bây giờ cách giải quyết sẽ giống như (cú pháp tạo công thức GNU):

cp -fl $^ $@ || cp -f $^ $@

Điều này tất nhiên sẽ đưa ra các thông báo lỗi giả trong trường hợp liên kết giữa các thiết bị, mặc dù sau đó đã thành công trong cpcuộc gọi thứ hai . Ngoài ra, sau đó điều này được mở rộng (dạng nguồn trông có thể đọc được), nó sẽ không còn quá dễ đọc nữa.

Câu trả lời:


8

cpkhông có tùy chọn này. Bạn có thể viết một tập lệnh bao bọc, nhưng nó khá đơn giản.

ln -f $^ $@ 2>/dev/null || cp -f $^ $@

GNU Coreutils 7.5 đã giới thiệu --reflinktùy chọn này. Nếu bạn vượt qua --reflink=autovà hệ thống tập tin cơ bản hỗ trợ sao chép trên ghi (ví dụ Btrfs hoặc ZFS) và bản sao xảy ra trên cùng một thiết bị, thì cpsẽ tạo ra một nút mới nhưng không sao chép nội dung; mặt khác cpthực hiện một bản sao bình thường. Đây vẫn không phải là một liên kết cứng (mục tiêu sẽ luôn là một inode khác), nhưng nó có thể thậm chí còn tốt hơn cho trường hợp sử dụng của bạn. Tuy nhiên, nếu bạn đang sử dụng ext4 (như hầu hết mọi người hiện nay), không hỗ trợ sao chép trên văn bản, điều này sẽ không giúp bạn.


1
Cảm ơn, gấp đôi $$trong trường hợp của tôi là tất nhiên bởi vì đây là trong một macro. Và dòng của bạn tất nhiên là một biến thể của những gì tôi đang sử dụng. Nhưng ít nhất tôi biết theo cách này rằng nó không tồn tại như một tùy chọn và tôi cần cung cấp cho riêng mình.
0xC0000022L

1
@ 0xC0000022L Nhân tiện, trong một vài năm, khi btrfs thay thế ext4, bạn có thể muốn sử dụng phế liệu lnvà sử dụng cp --reflink=auto(xem câu trả lời cập nhật của tôi).
Gilles 'SO- ngừng trở nên xấu xa'

Cảm ơn, rất cảm kích. Không biết về nó, mặc dù tôi đã thấy tùy chọn đó tại một số điểm.
0xC0000022L
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.