Dlaczego katalog jest kopiowany za pomocą polecenia cp mniejszy niż oryginał?

18

Próbuję skopiować jeden katalog z dużą liczbą plików do innego miejsca docelowego. Zrobiłem:

cp -r src_dir another_destination/

Następnie chciałem potwierdzić, że rozmiar katalogu docelowego jest taki sam jak oryginalny:

du -s src_dir
3782288 src_dir

du -s another_destination/src_dir
3502320 another_destination/src_dir

Potem pomyślałem, że może istnieć kilka dowiązań symbolicznych, po których nie następuje cppolecenie, i dodałem -aflagę:

-a Takie same jak opcje -pPR. Zachowuje strukturę i atrybuty plików, ale nie strukturę katalogów.

cp -a src_dir another_destination/

ale du -sdał mi te same wyniki. Interesujące jest to, że zarówno źródło, jak i miejsce docelowe mają taką samą liczbę plików i katalogów:

tree src_dir | wc -l
    4293

tree another_destination/src_dir | wc -l
    4293

Co robię źle, że otrzymuję różne rozmiary za pomocą dupolecenia?

AKTUALIZACJA

Kiedy próbuję uzyskać rozmiary poszczególnych katalogów za pomocą dupolecenia, otrzymuję różne wyniki:

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

Kiedy przeglądam pliki ls -la, poszczególne rozmiary plików są takie same, ale sumy są różne:

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
źródło
1
Interesujące pytanie. Czy źródłem i miejscem docelowym są różne dyski / nawijacze, jeśli sprowadza się to do wielkości bloku systemów plików.
davidgo
Cześć @davidgo, źródłem i miejscem docelowym są różne katalogi na tym samym dysku. Zaktualizowałem pytanie o ls -lawyniki. Zobacz AKTUALIZACJA
Hirurg103
2
Jaki system plików Być może same katalogi są większe (zajmują więcej miejsca), niż muszą. Porównaj to pytanie . Nowe utworzone katalogi cpsą dokładnie tak duże, jak powinny.
Kamil Maciorowski
Użyj, ls -lsaby zobaczyć, ile miejsca na dysku zajmują pliki.
Barmar
1
rekursywny md5sum jest Twoim przyjacielem, gdy musisz sprawdzić, czy wszystkie pliki są faktycznie skopiowane i czy zawartość jest taka sama. rsync to kolejne narzędzie, które może zarówno kopiować, jak i weryfikować całe struktury i pliki, a także przyspieszyć proces, jeśli niektóre pliki już istnieją.
GoFundMonica - codidact.org

Odpowiedzi:

21

Wynika to z tego, że dudomyślnie nie pokazuje rozmiaru pliku (-ów), ale miejsca na dysku, którego używają. Musisz użyć tej -bopcji, aby uzyskać sumę rozmiarów plików zamiast łącznej ilości miejsca na dysku. Na przykład:

% 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

Mimo że plik ma tylko 7 bajtów, zajmie całe 4096 bajtów miejsca na dysku (w moim konkretnym przykładzie; będzie się różnić w zależności od używanego systemu plików, wielkości klastra itp.).

Ponadto niektóre systemy plików obsługują tak zwane pliki rzadkie, które nie zajmują miejsca na dysku dla bloków, które są zerami. Na przykład:

% 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

Krótko mówiąc, aby sprawdzić, czy wszystkie pliki zostały skopiowane, należy użyć du -sbzamiast du -s.

Matija Nalis
źródło
1
nie tylko pliki rzadkie, ale także pliki skompresowane i pliki wbudowane / pliki rezydentne powodują, że rozmiar dysku staje się mniejszy niż rozmiar pliku
phuclv
1
I dziwne wyniki na btrfs / zfs.
val mówi Przywróć Monikę
2
@val: Kompresja BTRFS nie wpływa na dudane wyjściowe: sprawiłoby, że skompresowane pliki wyglądałyby rzadko na programy, które używają zwykłego algorytmu długości! = używane bloki. btrfs.wiki.kernel.org/index.php/…
Peter Cordes
@PeterCordes Ale materiał CoW sprawia, że ​​wyjście du jest dość bezsensowne.
val mówi Przywróć Monikę
Co ze zduplikowanymi plikami? Czy nowoczesne systemy nie mogą zaoszczędzić miejsca, rozpoznając zduplikowane treści?
FreeSoftwareServers
12

Może to wynikać z rozmiaru katalogu „pliki”.

W większości systemów plików na dysku katalog jest podobny do zwykłego pliku (głównie tylko z listą nazw i numerów węzłów), z rosnącą liczbą bloków.

Jeśli dodasz wiele plików, sam katalog powiększy się. Ale jeśli usuniesz je później, w wielu systemach plików katalog się nie zmniejszy.

Więc jeśli jeden z katalogów w twoim oryginalnym drzewie miał kiedyś wiele plików, które później zostały usunięte, kopia tego katalogu będzie „mniejsza”, ponieważ wykorzystuje tylko tyle bloków, ile potrzebuje dla bieżącej liczby plików.

Na listach w aktualizacji znajdują się 3 katalogi, których nie wymieniono. Porównaj wielkość tych (lub ich potomków) w swoich ls -alwynikach.

Aby znaleźć różnicę, możesz wypróbować ls -alroba katalogi, przekierowane do pliku, a następnie jeden diffz dwóch wyjść.

Jcaron
źródło
1
Dobry haczyk dla innej możliwości! Jednak w przypadku PO cp -a src_dir another_destination/jest mało prawdopodobne, ponieważ another_destionationbyłby nowo utworzony i w ten sposób zoptymalizowany, podczas gdy src_dir(który mógł mieć kilka większych katalogów z wcześniejszego tworzenia / dodawania) może rzeczywiście być większy niż potrzeba. Jednak wyniki pokazują, że w src_dirrzeczywistości jest mniejszy ( 1112 < 1168).
Matija Nalis
@MatijaNalis Tylko pierwszy przykład po „Aktualizacji” pokazuje, że (1112 <1168) ... poniższy przykład z odwróconymi liczbami, a pierwszy przykład pokazuje także większe źródło (3782288 vs. 3502320). Być może literówka OP?
TripeHound
> In the listings in your update, there are 3 directories you haven't listed. W rzeczywistości są to pliki, a nie katalogi. zobacz nazwy plików > if one of the directories in your original tree had many files at some point, which were later deleted. Skopiowałem katalog źródłowy ze zdalnego serwera za pomocą polecenia rsync i nic z niego nie
usunąłem
1
@ Hirurg103 .wpisy pokazują 5 linków na i-węźle. Jednym z nich jest link z katalogu nadrzędnego do tego. Innym jest .. Są jeszcze 3 linki, które powinny być ..linkami z podkatalogów. O ile nie brakuje mi czegoś bardzo dziwnego, muszą być w nich 3 podkatalogi. Czy mówisz, że te wykazy są pełnym wynikiem?
jcaron