Neden cp komutu ile kopyalanan bir dizin orijinalinden daha küçük?


18

Çok sayıda dosya içeren bir dizini başka bir hedefe kopyalamak için bağlıyorum. Yaptım:

cp -r src_dir another_destination/

Sonra hedef dizinin boyutunun orijinaliyle aynı olduğunu onaylamak istedim:

du -s src_dir
3782288 src_dir

du -s another_destination/src_dir
3502320 another_destination/src_dir

Sonra cpkomut tarafından takip edilmeyen ve -abayrağı ekleyen birkaç sembolik bağlantı olabileceğini düşündüm :

-a -pPR seçenekleriyle aynı. Dizin yapısını değil, dosya yapısını ve özniteliklerini korur.

cp -a src_dir another_destination/

ama du -sbana aynı sonuçları verdi. Hem kaynak hem de hedefin aynı sayıda dosya ve dizine sahip olması ilginçtir:

tree src_dir | wc -l
    4293

tree another_destination/src_dir | wc -l
    4293

Komutla farklı boyutlar elde etmek için neyi yanlış yapıyorum du?

GÜNCELLEME

Komutla bireysel dizinlerin boyutlarını almaya çalıştığımda dufarklı sonuçlar alıyorum:

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

Dosyaları görüntülediğimde ls -la, tek tek dosya boyutları aynıdır ancak toplamlar farklıdır:

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
İlginç soru. Dosya sistemlerinin blok boyutuna inerse kaynak ve hedef farklı sürücüler / ben sarıcı mıyız.
davidgo

Merhaba @ davidvid, kaynak ve hedef aynı sürücüde farklı dizinler. Soruyu ls -lasonuçlarla güncelledim . GÜNCELLEME
Hirurg103

2
Hangi dosya sistemi? Dizinlerin kendileri olması gerekenden daha büyük (daha fazla yer kaplar) olabilir. Bu soruyu karşılaştırın . Tarafından oluşturulan yeni dizinler cpolması gerektiği kadar büyüktür.
Kamil Maciorowski

ls -lsDosyaların ne kadar disk alanı kullandığını görmek için kullanın .
Barmar

1
özyinelemeli md5sum, tüm dosyaların gerçekten kopyalandığını ve içeriklerin aynı olduğunu doğrulamanız gerektiğinde arkadaşınızdır. rsync, tüm yapıları ve dosyaları kopyalayıp doğrulayabilen başka bir araçtır, ayrıca bazı dosyalar zaten mevcutsa işlemi hızlandırır.
GoFundMonica - codidact.org

Yanıtlar:


21

Bunun nedeni du, varsayılan olarak dosyaların boyutunu değil, kullandıkları disk alanını gösterir. -bKullanılan toplam disk alanı yerine dosya boyutlarının toplamını almak için seçeneği kullanmanız gerekir . Örneğin:

% 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

Dosya sadece 7 bayt uzunluğunda olsa da, 4096 baytlık bir disk alanı kaplar (benim özel örneğim; kullanılan dosya sistemine, küme boyutuna vb. Göre değişir).

Ayrıca, bazı dosya sistemleri, tümü sıfır olan bloklar için disk alanı kullanmayan seyrek dosyaları destekler. Örneğin:

% 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

Kısacası, tüm dosyaların kopyalandığını doğrulamak için du -sbyerine şunu kullanırsınız du -s.


1
sadece seyrek dosyalar değil, sıkıştırılmış dosyalar ve satır içi dosyalar / yerleşik dosyalar da disk boyutunun dosya boyutundan daha küçük olmasına neden olur
phuclv

1
Ve btrfs / zfs'de garip sonuçlar.
val diyor Reinstate Monica

2
@val: BTRFS sıkıştırması duçıktıyı etkilemez : bu, sıkıştırılmış dosyaların olağan uzunluk algoritmasını kullanan programlara seyrek görünmesini sağlar! = kullanılan bloklar. btrfs.wiki.kernel.org/index.php/…
Peter Cordes

@PeterCordes Ama CoW şeyler du çıkışını oldukça anlamsız hale getiriyor.
val diyor Reinstate Monica

Yinelenen dosyalar ne olacak? Modern sistemler, yinelenen içeriği tanıyarak yerden tasarruf edemez mi?
FreeSoftwareServers

12

Bunun nedeni "dosya" dizininin boyutu olabilir.

Çoğu dosya sisteminde, diskte, dizin, büyüdükçe daha fazla blok kullanan normal bir dosyaya (çoğunlukla ad ve düğüm numaralarının bir listesiyle) benzer.

Çok sayıda dosya eklerseniz, dizinin kendisi büyür. Ancak daha sonra bunları kaldırırsanız, birçok dosya sisteminde dizin küçülmez.

Bu nedenle, orijinal ağacınızdaki dizinlerden birinde, daha sonra silinen çok sayıda dosya varsa, o dizinin kopyası "daha küçük" olacaktır, çünkü yalnızca geçerli dosya sayısı için gereken sayıda blok kullanır.

Güncellemenizdeki listelerde, listelemediğiniz 3 dizin var. ls -alÇıktınızdaki (veya bunların torunları) boyutunu karşılaştırın .

Farkın nerede olduğunu bulmak için, ls -alrbir dosyaya yeniden yönlendirilen her iki dizinde bir ve daha sonra diffiki çıktıdan birini deneyebilirsiniz .


1
Başka bir olasılık için iyi yakalamak! Bununla birlikte, OP'lerde cp -a src_dir another_destination/, another_destionationyeni yaratılacak ve bu şekilde optimize edilebileceği gibi, olası değildir src_dir(bu da (geçmiş oluşturma / eklemelerden daha büyük bazı dizinlere sahip olabilir)) gerçekten gerekenden daha büyük olabilir. Ancak sonuçlar bunun src_diraslında daha küçük olduğunu göstermektedir ( 1112 < 1168).
Matija Nalis

@MatijaNalis Yalnızca "Güncelleme" den sonraki ilk örnekte (1112 <1168) ... rakamların tersine çevrildiği aşağıdaki örnek ve ilk örnek de kaynağın daha büyük olduğunu gösterir (3782288 vs. 3502320). Muhtemelen OP tarafından yazım hatası?
TripeHound

> In the listings in your update, there are 3 directories you haven't listed. Aslında bunlar dosya, dizin değil. dosya adlarına bakın > if one of the directories in your original tree had many files at some point, which were later deleted. Kaynak dizini rsync komutuyla uzak bir sunucudan kopyaladım ve ondan hiçbir şey
silmedim

1
@ Hirurg103 .girişler inode üzerinde 5 bağlantı gösterir. Bunlardan biri üst dizinden bu dizine olan bağlantıdır. Bir diğeri .. ..Alt dizinlerden bağlantılar olması gereken 3 bağlantı daha vardır . Çok garip bir şey kaçırmadıkça, bunlarda 3 alt dizin olmalı. Bu girişlerin tam çıktı olduğunu mu söylüyorsunuz?
jcaron
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.