Tại sao một thư mục được sao chép bằng lệnh cp nhỏ hơn bản gốc?


18

Tôi buộc phải sao chép một thư mục với số lượng lớn tệp đến đích khác. Tôi đã làm:

cp -r src_dir another_destination/

Sau đó, tôi muốn xác nhận rằng kích thước của thư mục đích giống với thư mục gốc:

du -s src_dir
3782288 src_dir

du -s another_destination/src_dir
3502320 another_destination/src_dir

Sau đó, tôi đã nghĩ rằng có thể có một số liên kết tượng trưng không được tuân theo cplệnh và thêm -acờ:

-a Giống như tùy chọn -pPR. Giữ nguyên cấu trúc và thuộc tính của tệp nhưng không phải cấu trúc thư mục.

cp -a src_dir another_destination/

nhưng du -scho tôi kết quả tương tự. Điều thú vị là cả nguồn và đích đều có cùng số lượng tệp và thư mục:

tree src_dir | wc -l
    4293

tree another_destination/src_dir | wc -l
    4293

Tôi đang làm gì sai khi tôi nhận được các kích cỡ khác nhau với dulệnh?

CẬP NHẬT

Khi tôi cố gắng lấy kích cỡ của các thư mục riêng lẻ bằng dulệnh tôi nhận được các kết quả khác nhau:

du -s src_dir/sub_dir1
1112    src_dir/sub_dir1

du -s another_destination/src_dir/sub_dir1
1168    another_destination/src_dir/sub_dir1

Khi tôi xem tệp với ls -la, kích thước tệp riêng lẻ giống nhau nhưng tổng số khác nhau:

ls -la src_dir/sub_dir1
total 1168
drwxr-xr-x     5 hirurg103  staff     160 Jan 30 20:58 .
drwxr-xr-x  1109 hirurg103  staff   35488 Jan 30 21:43 ..
-rw-r--r--     1 hirurg103  staff  431953 Jan 30 20:58 file1.pdf
-rw-r--r--     1 hirurg103  staff  126667 Jan 30 20:54 file2.png
-rw-r--r--     1 hirurg103  staff    7386 Jan 30 20:49 file3.png

ls -la another_destination/src_dir/sub_dir1
total 1112
drwxr-xr-x     5 hirurg103  staff     160 Jan 30 20:58 .
drwxr-xr-x  1109 hirurg103  staff   35488 Jan 30 21:43 ..
-rw-r--r--     1 hirurg103  staff  431953 Jan 30 20:58 file1.pdf
-rw-r--r--     1 hirurg103  staff  126667 Jan 30 20:54 file2.png
-rw-r--r--     1 hirurg103  staff    7386 Jan 30 20:49 file3.png

1
Câu hỏi thú vị. Là các ổ đĩa nguồn và đích khác nhau / Tôi cuộn nếu điều này đi xuống kích thước khối của các hệ thống tập tin.
davidgo

Xin chào @davidgo, nguồn và đích là các thư mục khác nhau trên cùng một ổ đĩa. Tôi đã cập nhật câu hỏi với ls -lakết quả. Xem CẬP NHẬT
Hirurg103

2
Hệ thống tập tin gì? Nó có thể là các thư mục chính nó lớn hơn (chiếm nhiều không gian hơn) cần thiết. So sánh câu hỏi này . Các thư mục mới được tạo bởi cpchính xác là lớn như họ cần phải có.
Kamil Maciorowski

Sử dụng ls -lsđể xem dung lượng đĩa đang sử dụng.
Barmar

1
md5sum đệ quy là bạn của bạn khi bạn cần xác minh rằng tất cả các tệp thực sự được sao chép và nội dung giống nhau. rsync là một công cụ khác có thể sao chép và xác minh toàn bộ cấu trúc và tệp, cũng tăng tốc quá trình nếu một số tệp đã được đặt sẵn.
GoFundMonica - codidact.org

Câu trả lời:


21

Đó là bởi vì dutheo mặc định hiển thị không phải kích thước của tệp, mà là không gian đĩa mà họ đang sử dụng. Bạn cần sử dụng -btùy chọn để lấy tổng kích thước tệp, thay vì tổng dung lượng đĩa được sử dụng. Ví dụ:

% printf test123 > a
% ls -l a
-rw-r--r-- 1 mnalis mnalis 7 Feb  1 19:57 a
% du -h a
4,0K    a
% du -hb a
7       a

Mặc dù tệp chỉ dài 7 byte, nhưng nó sẽ chiếm toàn bộ 4096 byte không gian đĩa (trong ví dụ cụ thể của tôi; nó sẽ thay đổi tùy theo hệ thống tệp được sử dụng, kích thước cụm, v.v.).

Ngoài ra, một số hệ thống tệp hỗ trợ cái gọi là tệp thưa thớt, không sử dụng bất kỳ không gian đĩa nào cho các khối đều là số không. Ví dụ:

% dd if=/dev/zero of=regular.bin bs=4k count=10
10+0 records in
10+0 records out
40960 bytes (41 kB, 40 KiB) copied, 0,000131003 s, 313 MB/s
% cp --sparse=always regular.bin sparse.bin
% ls -l *.bin
-rw-r--r-- 1 mnalis mnalis 40960 Feb  1 20:04 regular.bin
-rw-r--r-- 1 mnalis mnalis 40960 Feb  1 20:04 sparse.bin
% du -h *.bin
40K     regular.bin
0       sparse.bin
% du -hb *.bin
40960   regular.bin
40960   sparse.bin

Nói tóm lại, để xác minh tất cả các tệp đã được sao chép, bạn sẽ sử dụng du -sbthay vì du -s.


1
không chỉ các tệp thưa thớtcác tệp nén và tệp nội tuyến / tệp lưu trú cũng khiến kích thước trên đĩa trở nên nhỏ hơn kích thước tệp
phuclv

1
Và kết quả kỳ lạ trên btrfs / zfs.
val nói Phục hồi lại

2
@val: Nén BTRFS không ảnh hưởng đến duđầu ra: điều đó sẽ làm cho các tệp nén trông thưa thớt đối với các chương trình sử dụng thuật toán có độ dài thông thường! = Các khối được sử dụng. btrfs.wiki.kernel.org/index.php/ từ
Peter Cordes

@PeterCordes Nhưng công cụ CoW làm cho đầu ra du khá vô nghĩa.
val nói Phục hồi lại

Những gì về các tập tin trùng lặp? Hệ thống hiện đại không thể tiết kiệm không gian bằng cách nhận ra nội dung trùng lặp?
FreeSoftwareServers

12

Nó có thể là do kích thước của "tập tin" thư mục.

Trong hầu hết các hệ thống tệp, trên đĩa, một thư mục giống như một tệp thông thường (chủ yếu chỉ có một danh sách tên và số nút), sử dụng nhiều khối hơn khi nó phát triển.

Nếu bạn thêm nhiều tập tin, thư mục sẽ phát triển. Nhưng nếu bạn loại bỏ chúng sau đó, trong nhiều hệ thống tập tin, thư mục sẽ không co lại.

Vì vậy, nếu một trong các thư mục trong cây ban đầu của bạn có nhiều tệp tại một thời điểm nào đó, sau đó đã bị xóa, bản sao của thư mục đó sẽ "nhỏ hơn", vì nó chỉ sử dụng nhiều khối như nó cần cho số lượng tệp hiện tại.

Trong danh sách trong bản cập nhật của bạn, có 3 thư mục bạn chưa liệt kê. So sánh kích thước của những người đó (hoặc hậu duệ của những người đó) trong ls -alđầu ra của bạn .

Để tìm sự khác biệt ở đâu, bạn có thể thử ls -alrtrên cả hai thư mục, được chuyển hướng đến một tệp và sau đó là một difftrong hai đầu ra.


1
Bắt tốt cho một khả năng khác! Tuy nhiên, trong trường hợp OP cp -a src_dir another_destination/thì không thể, vì another_destionationnó sẽ được tạo mới và do đó được tối ưu hóa, trong khi src_dir(có thể có một số thư mục lớn hơn từ việc tạo / bổ sung trong quá khứ) thực sự có thể lớn hơn mức cần thiết. Tuy nhiên kết quả cho thấy src_dirthực sự nhỏ hơn ( 1112 < 1168).
Matija Nalis

@MatijaNalis Chỉ ví dụ đầu tiên sau "Cập nhật" cho thấy (1112 <1168) ... ví dụ dưới đây có các số liệu đảo ngược và ví dụ đầu tiên cũng cho thấy nguồn lớn hơn (3782288 so với 3502320). Có thể là một lỗi đánh máy của OP?
TripeHound

> In the listings in your update, there are 3 directories you haven't listed. Trên thực tế chúng là các tập tin, không phải thư mục. xem tên tập tin > if one of the directories in your original tree had many files at some point, which were later deleted. Tôi đã sao chép thư mục nguồn từ một máy chủ từ xa bằng lệnh rsync và không xóa bất cứ thứ gì khỏi nó
Hirurg103

1
@ Hirurg103 các .mục hiển thị 5 liên kết trên inode. Một là liên kết từ thư mục cha đến cái này. Khác là .. Có thêm 3 liên kết, nên là ..liên kết từ các thư mục con. Trừ khi tôi thiếu một cái gì đó rất kỳ lạ, phải có 3 thư mục con trong đó. Bạn đang nói rằng những danh sách đó là đầu ra đầy đủ?
jcaron
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.