Pourquoi un répertoire copié avec la commande cp est-il plus petit que l'original?

18

Je tente de copier un répertoire contenant un grand nombre de fichiers vers une autre destination. J'ai fait:

cp -r src_dir another_destination/

Ensuite, je voulais confirmer que la taille du répertoire de destination est la même que celle d'origine:

du -s src_dir
3782288 src_dir

du -s another_destination/src_dir
3502320 another_destination/src_dir

Ensuite, j'ai pensé qu'il pourrait y avoir plusieurs liens symboliques qui ne sont pas suivis par la cpcommande et j'ai ajouté le -adrapeau:

-a Identique aux options -pPR. Préserve la structure et les attributs des fichiers mais pas la structure des répertoires.

cp -a src_dir another_destination/

mais du -sm'a donné les mêmes résultats. Il est intéressant que la source et la destination aient le même nombre de fichiers et de répertoires:

tree src_dir | wc -l
    4293

tree another_destination/src_dir | wc -l
    4293

Que fais-je de mal à obtenir différentes tailles avec la ducommande?

MISE À JOUR

Lorsque j'essaie d'obtenir des tailles de répertoires individuels avec la ducommande, j'obtiens des résultats différents:

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

Lorsque je consulte des fichiers avec ls -la, les tailles de fichier individuelles sont les mêmes, mais les totaux sont différents:

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
la source
1
Question interessante. La source et la destination sont-elles des lecteurs / enrouleurs différents si cela se résume à la taille de bloc des systèmes de fichiers.
davidgo
Bonjour @davidgo, la source et la destination sont des répertoires différents sur le même lecteur. J'ai mis à jour la question avec des ls -larésultats. Voir MISE À JOUR
Hirurg103
2
Quel système de fichiers? Il se peut que les répertoires eux-mêmes soient plus grands (prennent plus d'espace) qu'ils n'en ont besoin. Comparez cette question . Les nouveaux répertoires créés par cpsont exactement aussi volumineux qu'ils doivent l'être.
Kamil Maciorowski
Utilisez ls -lspour voir combien d'espace disque les fichiers utilisent.
Barmar
1
récursif md5sum est votre ami lorsque vous devez vérifier que tous les fichiers sont réellement copiés et que le contenu est le même. rsync est un autre outil qui peut à la fois copier et vérifier des structures et des fichiers entiers, accélère également le processus si certains fichiers sont déjà en place.
GoFundMonica - codidact.org

Réponses:

21

En effet, dupar défaut, la taille des fichiers n'est pas affichée, mais l'espace disque qu'ils utilisent. Vous devez utiliser l' -boption pour obtenir la somme des tailles de fichier, au lieu du total de l'espace disque utilisé. Par exemple:

% 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ême si le fichier ne fait que 7 octets, il occupera un total de 4096 octets d'espace disque (dans mon exemple particulier; il variera en fonction du système de fichiers utilisé, de la taille du cluster, etc.).

De plus, certains systèmes de fichiers prennent en charge les fichiers dits clairsemés, qui n'utilisent pas d'espace disque pour les blocs qui sont tous des zéros. Par exemple:

% 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

En bref, pour vérifier que tous les fichiers ont été copiés, vous devez utiliser à la du -sbplace de du -s.

Matija Nalis
la source
1
non seulement les fichiers épars mais les fichiers compressés et les fichiers en ligne / fichiers résidents entraînent également une
réduction de
1
Et des résultats étranges sur btrfs / zfs.
val dit Réintégrer Monica le
2
@val: La compression BTRFS n'affecte pas la dusortie: cela rendrait les fichiers compressés rares aux programmes qui utilisent l'algorithme habituel de longueur! = blocs utilisés. btrfs.wiki.kernel.org/index.php/…
Peter Cordes
@PeterCordes Mais les trucs CoW rendent le résultat assez insensé.
val dit Réintégrer Monica le
Qu'en est-il des fichiers en double? Les systèmes modernes ne peuvent-ils pas économiser de l'espace en reconnaissant le contenu en double?
FreeSoftwareServers
12

Cela peut être dû à la taille du répertoire "fichiers".

Dans la plupart des systèmes de fichiers, sur disque, un répertoire ressemble beaucoup à un fichier normal (avec juste une liste de noms et de numéros de nœuds, principalement), utilisant plus de blocs à mesure qu'il grandit.

Si vous ajoutez de nombreux fichiers, le répertoire lui-même s'agrandit. Mais si vous les supprimez ensuite, dans de nombreux systèmes de fichiers, le répertoire ne rétrécira pas.

Donc, si l'un des répertoires de votre arborescence d'origine contenait à un moment donné de nombreux fichiers, qui ont ensuite été supprimés, la copie de ce répertoire sera "plus petite", car elle utilise uniquement autant de blocs que nécessaire pour le nombre actuel de fichiers.

Dans les listes de votre mise à jour, il y a 3 répertoires que vous n'avez pas répertoriés. Comparez la taille de ceux (ou de leurs descendants) dans votre ls -alsortie.

Pour trouver où se trouve la différence, vous pouvez essayer un ls -alrsur les deux répertoires, redirigé vers un fichier, puis l'une diffdes deux sorties.

jcaron
la source
1
Bonne prise pour une autre possibilité! Cependant, dans le cas des OP, cp -a src_dir another_destination/il est peu probable, car il another_destionationserait nouvellement créé et donc optimisé, tandis que src_dir(qui aurait pu avoir des répertoires plus grands de la création / des ajouts précédents) pourrait en effet être plus grand que nécessaire. Cependant, les résultats montrent qu'il src_direst en fait plus petit ( 1112 < 1168).
Matija Nalis
@MatijaNalis Seul le premier exemple après "Update" montre que (1112 <1168) ... l'exemple ci-dessous qui a les chiffres inversés, et le premier exemple montre également la source plus grande (3782288 contre 3502320). Peut-être une faute de frappe par OP?
TripeHound
> In the listings in your update, there are 3 directories you haven't listed. En fait, ce sont des fichiers, pas des répertoires. voir les noms de fichiers > if one of the directories in your original tree had many files at some point, which were later deleted. J'ai copié le répertoire source d'un serveur distant avec la commande rsync et n'y ai rien supprimé
Hirurg103
1
@ Hirurg103 les .entrées affichent 5 liens sur l'inode. L'un est le lien du répertoire parent vers celui-ci. Un autre est .. Il y a 3 autres liens, qui devraient être des ..liens de sous-répertoires. Sauf si je manque quelque chose de très bizarre, il doit y avoir 3 sous-répertoires dans ceux-ci. Voulez-vous dire que ces listes sont la sortie complète?
jcaron