cp so với mèo để sao chép một tập tin


12

cp a bcat a > b, sự khác biệt là gì?

Trong tập lệnh cài đặt x86 của cây nguồn linux ( arch/x86/boot/install.sh), cả hai đều được sử dụng:

cat $2 > $4/vmlinuz
cp $3 $4/System.map

Tại sao họ không giữ định dạng giống nhau nếu cái này tốt hơn cái kia?

Câu trả lời:


14

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.

  1. 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
  2. kích thước nó - nó không nên mất bất kỳ không gian.

    17> du -sh sparsetest
    0       sparsetest
  3. 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
  4. 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
  5. thử các công cụ ưa thích của bạn để kiểm tra hành vi của họ

  6. đừ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ó.


1
Vì vậy, cplàm cho một tệp giống như bản gốc, trong khi cattạo một tệp mới có cùng nội dung.
Qian

Cả hai công cụ đều hoạt động dựa trên nội dung, nhưng cp (ít nhất là các triển khai "hiện đại") nhận thức được một số đặc sản hiện nay, như các lỗ hổng (các triển khai cũ của mèo sẽ chạy vào cái bẫy đó). Ngoài ra còn có các hệ thống tệp không biết về khái niệm tệp thưa, ví dụ HFS + (MacOS) hoặc FAT (MSDOS, USB-Stick, v.v.), khiến chúng bị nổ hết cỡ. Vì vậy, có những chòm sao mà cp hoặc mèo sẽ không tạo ra sự khác biệt trong thực tế.
Tatjana Heuser

Btw, GNU 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.
oguz ismail

6

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 đó.


đó có phải là lý do để nhanh hơn thuộc tính cat?
Nikhil Mulley

2
catnhanh hơn?
Qian

4

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.


3
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.

4
catkhông có gì để làm với giao diện điều khiển. Cả hai catcpđọ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.
Gilles 'SO- ngừng trở nên xấu xa'

2

Đó 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.


3
cp-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.
Keith Thompson

Điểm tốt! Vì vậy, vmlinuzsẽ không được thực thi cho dù $2là.
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.