Чому каталог, скопійований командою cp, менший за оригінал?


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

1
Цікаве запитання. Чи відрізняються джерело та призначення дисководів / я намотування, якщо це зводиться до розміру блоку файлових систем.
davidgo

Привіт @davidgo, джерело та місце призначення - це різні каталоги на одному диску. Я оновив питання з ls -laрезультатами. Дивіться ОНОВЛЕННЯ
Hirurg103

2
Яка файлова система? Можливо, самі каталоги є більшими (займають більше місця), ніж їм потрібно. Порівняйте це питання . Нові довідники, створені компанією cp, рівнобічні, як і потрібно.
Каміль Маціоровський

Використовуйте, ls -lsщоб побачити, скільки дискового простору використовують файли.
Вармар

1
рекурсивний 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.


1
не тільки розріджені файли, але стиснуті файли та вбудовані файли / резидентні файли також призводять до того, що розмір на диску стає меншим за розмір файлу
phuclv

1
І дивні результати на btrfs / zfs.
val каже

2
@val: Стиснення BTRFS не впливає на duвихід: це призведе до того, що стислі файли виглядають розрідженими для програм, що використовують звичайний алгоритм довжини! = використовувані блоки. btrfs.wiki.kernel.org/index.php/…
Пітер Кордес

@PeterCordes Але речі, що стосуються корів, роблять висновок дуже безглуздим.
Вал каже:

Що щодо дублікатів файлів? Не вдається сучасні системи економити простір, розпізнаючи повторюваний вміст?
FreeSoftwareServers

12

Це може бути пов'язано з розміром каталогу "файли".

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

Якщо додати багато файлів, сам каталог зростає. Але якщо ви видалите їх згодом, у багатьох файлових системах каталог не скорочуватиметься.

Отже, якщо в одному з каталогів вашого початкового дерева в якийсь момент було багато файлів, які згодом були видалені, копія цього каталогу буде "меншою", оскільки для цього використовується лише стільки блоків, скільки потрібно для поточної кількості файлів.

У списках вашого оновлення є 3 каталоги, які ви не вказали. Порівняйте розмір тих (або нащадків) у ваших ls -alрезультатах.

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


1
Гарний улов для іншої можливості! Однак у випадку ОП cp -a src_dir another_destination/це малоймовірно, як це another_destionationбуло б новостворене та оптимізоване таким чином, тоді як src_dir(які, можливо, мали б декілька більших каталогів із минулого створення / доповнення), справді це може бути більшим, ніж потрібно. Однак результати показують, що src_dirнасправді менше ( 1112 < 1168).
Matija Nalis

@MatijaNalis Лише перший приклад після "Оновлення" показує, що (1112 <1168) ... наведений нижче приклад має зміни фігур, і перший приклад також показує джерело більше (3782288 проти 3502320). Можливо, друкарська справа з боку ОП?
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 і нічого з нього не
видалив

1
@ Hirurg103 .записи показують 5 посилань на inode. Один - посилання з батьківського каталогу на цей. Інша є .. Є ще 3 посилання, які мають бути ..посиланнями з підкаталогів. Якщо я пропускаю щось дуже дивне, у них повинно бути три підкаталоги. Ви хочете сказати, що ці списки є повним результатом?
jcaron
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.