Theo mặc định, cp
kiểm tra nếu đối số cuối cùng của nó là một thư mục hiện có. Nếu điều này xảy ra, cp
tạo một liên kết bên trong thư mục đó, với tên cơ sở của nguồn. Đó là, đưa ra lệnh
cp foo/bar wibble
nếu wibble
là một thư mục hiện có thì cp
sao chép nguồn vào wibble/bar
. Nếu wibble
không tồn tại thì cp
liên kết nguồn tới wibble
.
Nếu bạn muốn chắc chắn rằng bản sao luôn luôn wibble
, thì bạn có thể chỉ định tùy chọn --no-target-directory
(bí danh -T
). Bằng cách đó, nếu cp
thành công, bạn có thể chắc chắn rằng bản sao được gọi wibble
. Nếu wibble
đã tồn tại như một thư mục, thì cp
sẽ thất bại.
Ở dạng bảng:
The target is … Without -T With -T
existing directory copy in the directory error
existing file (not dir) overwrite overwrite
does not exist create create
Sự khác biệt duy nhất là với -T
, trong trường hợp đích là một thư mục hiện có, lệnh sẽ trả về một lỗi. Điều này hữu ích khi bạn mong muốn thư mục không tồn tại: bạn nhận được thông báo lỗi thay vì điều gì đó không dự đoán được xảy ra.
Điều tương tự áp dụng cho mv
và ln
. Nếu mục tiêu là một thư mục hiện có, với -T
, chúng báo hiệu một lỗi thay vì âm thầm làm điều gì đó khác đi.
Với cp
, có một trường hợp khác. Nếu bạn thực hiện một bản sao đệ quy và nguồn là một thư mục, sau đó cp -T
sao chép nội dung của nguồn vào đích, thay vì sao chép chính nguồn đó. Đó là, đã cho
$ tree source destination
source
└── foo
destination
└── bar
sau đó
$ cp -rv source destination
`source' -> `destination/source'
`source/foo' -> `destination/source/foo'
trong khi
% cp -rvT source destination
`source/foo' -> `destination/foo'
--no-target-directory
tùy chọn [out] : miễn là tôi sử dụng --recursive, mọi thứ đều ổn [vớicoreutils 8.12
GNU / Linux]. Sự khác biệt chính dường như là với--no-target-directory
nội dung nhưng bản thân thư mục không được sao chép [nghiên cứu vẫn đang được tiến hành]