Đó là cái vỏ mở rộng các ký tự đại diện, không phải các lệnh. Vì vậy, cp dir1/* dir2/*
đầu tiên mở rộng hai ký tự đại diện, sau đó gọi cp
kết quả. Đây hoàn toàn không phải là những gì bạn mong đợi: tùy thuộc vào số lượng tệp đã có dir2
, dir2/*
có thể mở rộng thành một hoặc nhiều đối số. Lệnh cp
không biết đối số nào đến từ việc mở rộng mẫu đầu tiên và đối số nào đến từ việc mở rộng mẫu thứ hai. Nó hy vọng đối số cuối cùng của nó là tên của thư mục đích. Do đó, để sao chép tất cả các tệp từ thư mục dir1
vào thư mục dir2
, đối số cuối cùng phải là thư mục dir2
:
cp dir1/* dir2
Vì *
phù hợp với tất cả các tệp, cp
cố gắng sao chép tất cả các tệp. Điều này bao gồm các thư mục: thư mục là tập tin quá. Nó bỏ qua các thư mục, nhưng báo lỗi. Nó sao chép nội dung của các tệp đặc biệt như các ống có tên (một cái gì đó tốt hơn là viết cho chúng, hoặc cp
sẽ chặn), v.v.
Để chỉ sao chép các tệp thông thường , bạn cần hạn chế kết hợp. Trong zsh, bạn có thể sử dụng vòng loại toàn cầu .
cho điều đó:
cp dir1/*(.) dir2
Các vỏ khác không có cái này. Bạn có thể sử dụng find
lệnh để lọc các loại tệp. Giả sử rằng bạn đang chạy Linux hoặc Cygwin không nhúng:
find dir1 -maxdepth 1 -type f -exec cp -t dir2 {} +
Trên Linux, FreeBSD và OSX:
find dir1 -maxdepth 1 -type f | xargs -I {} cp {} dir2