Tại sao một số lệnh GNU Coreutils có -T/--no-target-directory
tùy chọn? Có vẻ như mọi thứ mà nó có thể đạt được bằng cách sử dụng ngữ nghĩa của .
(dấu chấm tự) trong hệ thống phân cấp thư mục Unix truyền thống.
Xem xét:
cp -rT /this/source dir
Các -T
tùy chọn ngăn cản việc sao chép từ việc tạo ra một dir/source
thư mục con. Thay vào đó /this/source
được xác định dir
và nội dung được ánh xạ giữa các cây tương ứng. Vì vậy, ví dụ /this/source/foo.c
đi dir/foo.c
và hơn, hơn là để dir/source/foo.c
.
Nhưng điều này có thể dễ dàng thực hiện mà không cần -T
tùy chọn sử dụng:
cp -r /this/source/. dir # Probably worked fine since dawn of Unix?
Về mặt ngữ nghĩa, thành phần dấu chấm được sao chép như một đứa trẻ của dir
, nhưng tất nhiên "đứa trẻ" đó đã tồn tại (vì vậy không phải tạo ra) và thực sự là dir
chính nó, vì vậy hiệu quả /this/path
được xác định dir
.
Nó hoạt động tốt nếu thư mục hiện tại là mục tiêu:
cp -r /this/tree/node/. . # node's children go to current dir
Có điều gì bạn có thể làm chỉ với -T
điều đó có thể hợp lý hóa sự tồn tại của nó? (Bên cạnh hỗ trợ cho các hệ điều hành không triển khai thư mục dấu chấm, một lý do không được đề cập trong tài liệu.)
Có phải mẹo chấm ở trên không giải quyết được các điều kiện chủng tộc giống như được đề cập trong tài liệu Thông tin GNU về -T
?
.
thuật này hoạt động khi sao chép một tập tin, không phải khi đổi tên cơ sở của nó cùng một lúc!cp /path/to/file /target/dir/.
Nếu/target/dir/file
tồn tại và là một thư mục, bạn có được chẩn đoán tương tự! Nhưng bạn đã chỉ ra những gì-T
không thể thực hiện được nếu không có nó trong một bước, không có điều kiện chủng tộc: sao chép một tệp và thay đổi tên của nó mà không bị chuyển sang thư mục con.