Câu trả lời:
Một vấn đề nữa xuất hiện trong đầu tôi khi mà cat
vs cp
tạ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/s
kích thước nó - nó không nên mất bất kỳ không gian.
17> du -sh sparsetest
0 sparsetest
sao chép nó với cp và kiểm tra kích thước
18> cp sparsetest sparsecp
19> du -sh sparsecp
0 sparsecp
Bâ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 sparsecat
thử 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ó.
cp
có 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=never
chỉ định trên dòng lệnh, cp
là chậm như cat
.
Theo nhận xét của Keith , cp
bảo tồn một số quyền và cat
tạo tệp mới như umask
biểu thị. Vì vậy, $2
sự cho phép không được bảo tồn $4/vmlinuz
khá sạch sẽ, trong khi nếu một số quyền lạ được đặt $3
, $4/System.map
sẽ giữ nguyên điều đó.
cat
?
cat
nhanh 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
.
cat
Sẽ 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.
cat
không có gì để làm với giao diện điều khiển. Cả hai cat
và 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. cp
có thể nhanh hơn, nhưng vì một lý do hoàn toàn khác: một số triển khai cp
cố 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 cat
sẽ 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.
cp
mà -p
không bảo tồn một số quyền. Ví dụ: nếu tệp nguồn có thể thực thi được, cp
sẽ làm cho tệp đích có thể thực thi được, nhưng cat
sẽ không.
cp
làm cho một tệp giống như bản gốc, trong khicat
tạo một tệp mới có cùng nội dung.