Почему каталог копируется с помощью команды ср меньше, чем оригинал?

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
Hirurg103
источник
1
Интересный вопрос. Являются ли исходные и целевые разные диски / I моталки, если это сводится к размеру блока файловых систем.
davidgo
Привет @davidgo, источник и назначение разные каталоги на тот же диск. Я обновил этот вопрос с ls -laрезультатами. Смотрите ОБНОВЛЕНИЕ
Hirurg103
2
Что файловая система? Это может быть каталогами самих больше (занимает больше места) , чем они должны быть. Сравните этот вопрос . Новые каталоги, созданные с помощью программы, cpимеют настолько большой размер, насколько это необходимо.
Камиль Мачоровски
Используйте, ls -lsчтобы увидеть, сколько дискового пространства используют файлы.
Бармар
1
recursive md5sum - ваш друг, когда вам нужно убедиться, что все файлы действительно скопированы и их содержимое одинаково. Rsync это еще один инструмент , который может одновременно копировать и проверять целые структуры и файлы, а также ускоряет процесс , если некоторые файлы уже на месте.
GoFundMonica - codidact.org

Ответы:

21

Это связано с тем, что 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.

Матия Nalis
источник
1
не только разреженные файлы , но сжатые файлы и встроенные файлы / резидентные файлы также вызвать размер на диске , чтобы стать меньше , чем размер файла
phuclv
1
И странные результаты на btrfs / zfs.
Вэл говорит восстановило Моника
2
@val: сжатие BTRFS не влияет на duвывод: из-за этого сжатые файлы выглядят разреженными для программ, использующих обычный алгоритм длины! = используемые блоки. btrfs.wiki.kernel.org/index.php/…
Питер Кордес
@PeterCordes Но CoW вещи делают вывод довольно бессмысленным.
говорит
Как насчет дубликатов файлов? Разве современные системы не могут сэкономить пространство, распознавая дублирующийся контент?
FreeSoftwareServers
12

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

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

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

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

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

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

jcaron
источник
1
Хороший улов для другой возможности! Однако, в случае ФОС cp -a src_dir another_destination/это маловероятно, так как another_destionationбудет вновь созданный и оптимизируя , таким образом, в то время как src_dir(что , возможно, имели некоторые большие каталоги из прошлых создания / дополнений) действительно может быть больше , чем нужно. Однако результаты показывают, что src_dirна самом деле меньше ( 1112 < 1168).
Матия Налис
@MatijaNalis Только первый пример после «Обновления» показывает, что (1112 <1168) ... в приведенном ниже примере цифры обращены, а в первом примере также показан источник большего размера (3782288 против 3502320). Возможно опечатка от OP?
TripeHound
> In the listings in your update, there are 3 directories you haven't listed, На самом деле они представляют собой файлы, а не каталоги. увидеть имена файлов > if one of the directories in your original tree had many files at some point, which were later deleted. Я скопировал исходный каталог с удаленного сервера с Rsync команды и не сделал ничего удалять из него
Hirurg103
1
@ Hirurg103 в .записи показывают 5 ссылок на индексный дескриптор. Одним из них является ссылка из родительского каталога в этом. Другой есть .. Есть еще 3 ссылки, которые должны быть ..ссылки из подкаталогов. Если я что - то очень странное отсутствует, должно быть 3 подкаталоги в тех. Вы говорите , что эти списки полный выход?
jcaron