18

Я пытаюсь скопировать один каталог с большим количеством файлов в другое место назначения. Я сделал:

cp -r src_dir another_destination/

Затем я хотел подтвердить, что размер каталога назначения совпадает с исходным:

du -s src_dir
3782288 src_dir

du -s another_destination/src_dir
3502320 another_destination/src_dir

Затем я подумал, что может быть несколько символических ссылок, за которыми не следует команда cp и добавил флаг -a :

-a То же, что и параметры -pPR. Сохраняет структуру и атрибуты файлов, но не структуру каталогов.

cp -a src_dir another_destination/

но du -s дал мне тот же результат. Интересно, что и источник, и пункт назначения имеют одинаковое количество файлов и каталогов:

tree src_dir | wc -l
    4293

tree another_destination/src_dir | wc -l
    4293

Что я делаю не так, что получаю разные размеры с помощью команды du ?

ОБНОВИТЬ

Когда я пытаюсь получить размеры отдельных каталогов с помощью команды du я получаю разные результаты:

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

Когда я просматриваю файлы с помощью ls -la , отдельные размеры файлов одинаковы, но итоговые значения различаются:

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

2 ответа2

22

Это потому, что du по умолчанию показывает не размер файла (ов), а дисковое пространство, которое они используют. Вам нужно использовать опцию -b чтобы получить сумму размеров файлов вместо общего объема используемого дискового пространства. Например:

% 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

Несмотря на то, что размер файла составляет всего 7 байт, он будет занимать целое 4096 байт дискового пространства (в моем конкретном примере; он будет варьироваться в зависимости от используемой файловой системы, размера кластера и т.д.).

Кроме того, некоторые файловые системы поддерживают так называемые разреженные файлы, которые не используют дисковое пространство для блоков, которые являются нулями. Например:

% 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

Короче говоря, чтобы убедиться, что все файлы были скопированы, вы должны использовать du -sb вместо du -s .

12

Это может быть связано с размером каталога "файлы".

В большинстве файловых систем на диске каталог очень похож на обычный файл (в основном это просто список имен и номеров узлов), использующий больше блоков по мере роста.

Если вы добавляете много файлов, сам каталог увеличивается. Но если вы удалите их впоследствии, во многих файловых системах каталог не будет уменьшаться.

Поэтому, если в какой-то момент в одном из каталогов в вашем исходном дереве было много файлов, которые впоследствии были удалены, копия этого каталога будет "меньше", поскольку она использует столько блоков, сколько необходимо для текущего количества файлов.

В списках в вашем обновлении есть 3 каталога, которых вы не указали. Сравните размер этих (или их потомков) в выводе ls -al .

Чтобы выяснить, в чем разница, вы можете попробовать ls -alr в обоих каталогах, перенаправить в файл, а затем diff двух выходных данных.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .