Câu trả lời:
Một vấn đề nữa xuất hiện trong đầu tôi khi mà catvs cptạo ra sự khác biệt đáng kể:
Theo định nghĩa, cat sẽ mở rộng các tệp thưa thớt, lấp đầy các khoảng trống bằng các byte "thực", trong khi cp ít nhất có thể được yêu cầu bảo toàn các lỗ hổng.
Các tệp thưa thớt là các tệp trong đó các chuỗi 0 byte đã được thay thế bằng siêu dữ liệu để bảo toàn không gian. Bạn có thể kiểm tra bằng cách tạo một cái bằng dd và sao chép nó bằng các công cụ bạn chọn.
Tạo một tệp thưa thớt (thay đổi thành / tmp trước để tránh sự cố - xem ghi chú cuối cùng):
15> cd /tmp
16> dd if=/dev/null of=sparsetest bs=512b seek=5
0+0 records in
0+0 records out
0 bytes (0 B) copied, 5.9256e-05 s, 0.0 kB/skích thước nó - nó không nên mất bất kỳ không gian.
17> du -sh sparsetest
0 sparsetestsao chép nó với cp và kiểm tra kích thước
18> cp sparsetest sparsecp
19> du -sh sparsecp
0 sparsecpBây giờ sao chép nó với con mèo và kiểm tra kích thước
20> cat sparsetest > sparsecat
21> du -sh sparsecat
1.3M sparsecatthử các công cụ ưa thích của bạn để kiểm tra hành vi của họ
đừng quên dọn dẹp.
Lưu ý cuối cùng: Các thử nghiệm như thế này có cơ hội nổi tiếng vốn có với sysadmin địa phương của bạn nếu bạn thực hiện chúng trên một hệ thống tệp là một phần của kế hoạch dự phòng của anh ấy, hoặc quan trọng đối với sức khỏe của hệ thống. Tùy thuộc vào lựa chọn công cụ sao lưu của mình, cuối cùng anh ta có thể cần nhiều phương tiện băng hơn mà anh ta cho rằng có thể sao lưu một tệp 0 byte được mở rộng thành terabyte số 0.
Các tệp khác không thể được sao chép bằng cả mèo và cp sẽ không bao gồm các tệp đặc biệt của thiết bị, v.v. Điều này phụ thuộc vào việc triển khai công cụ sao chép của bạn nếu nó có thể sao chép nút thiết bị hoặc thay vào đó sẽ sao chép nội dung của nó.
cpcó một tùy chọn để kiểm soát hành vi của nó trên các tệp thưa thớt; như, với --sparse=neverchỉ định trên dòng lệnh, cplà chậm như cat.
Theo nhận xét của Keith , cpbảo tồn một số quyền và cattạo tệp mới như umaskbiểu thị. Vì vậy, $2sự cho phép không được bảo tồn $4/vmlinuzkhá sạch sẽ, trong khi nếu một số quyền lạ được đặt $3, $4/System.mapsẽ giữ nguyên điều đó.
cat?
catnhanh hơn?
Cả hai đều có chức năng tương đương trong hai trường hợp đó, nhưng cp hoàn toàn là một hoạt động tập tin. "Lấy tập tin này và tạo một bản sao của nó ở đó".
mặt khác, mèo có ý định đổ nội dung của tệp ra bàn điều khiển. "Lấy tệp này và hiển thị nó trên màn hình" và sau đó có một ninja tấn công màn hình và chuyển hướng đầu ra ở nơi khác.
cp nói chung sẽ hiệu quả hơn, vì không có chuyển hướng nào, chỉ đơn thuần là sao chép trực tiếp các byte từ vị trí A sang vị trí B.
mèo sẽ read bytes -> output to console -> intercept output -> redirect to new file.
catSẽ không thực sự output to console -> intercept output -> redirect to new file, tệp đầu ra cho mèo có thể là thiết bị xuất chuẩn hoặc tệp bình thường, nó sẽ chỉ xuất ra tệp, miễn là đầu vào không giống với đầu ra.
catkhông có gì để làm với giao diện điều khiển. Cả hai catvà cpđọc từ tệp đầu vào và ghi vào tệp đầu ra. Với cat, tệp đầu ra được mở bởi trình bao, trong khi đó cp, tệp đầu ra được mở bằng cp; Điều này làm cho không có sự khác biệt trong hiệu suất. cpcó thể nhanh hơn, nhưng vì một lý do hoàn toàn khác: một số triển khai cpcố gắng đoán đúng kích thước khối cho hiệu suất tùy thuộc vào nguồn và thiết bị đích; việc thực hiện catsẽ không làm phiền.
Đó thực sự là một vấn đề ưu tiên, IMHO.
Về mặt kỹ thuật không có sự khác biệt thực sự trừ khi bạn sử dụng lệnh cp với công tắc -p để duy trì quyền sở hữu / nhóm tệp. Mặt khác, đó là điều tương tự về chức năng. Câu trả lời của Marc rõ ràng dài dòng hơn và chính xác hơn.
cpmà -pkhông bảo tồn một số quyền. Ví dụ: nếu tệp nguồn có thể thực thi được, cpsẽ làm cho tệp đích có thể thực thi được, nhưng catsẽ không.
cplàm cho một tệp giống như bản gốc, trong khicattạo một tệp mới có cùng nội dung.