web-dev-qa-db-ja.com

cpコマンドでコピーしたディレクトリが元のディレクトリよりも小さいのはなぜですか?

多数のファイルがある1つのディレクトリーを別の宛先にコピーするつもりです。やった:

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
18
Hirurg103

これは、デフォルトでは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を使用します。

21
Matija Nalis

ディレクトリ「ファイル」のサイズが原因である可能性があります。

ほとんどのファイルシステムでは、ディスク上で、ディレクトリは通常のファイル(ほとんどの場合、名前とノード番号のリストのみ)に似ており、成長するにつれてより多くのブロックを使用します。

多くのファイルを追加すると、ディレクトリ自体が大きくなります。しかし、それらを後で削除した場合、多くのファイルシステムでは、ディレクトリは縮小しません。

したがって、元のツリーのディレクトリの1つに、後で削除された多くのファイルがあった場合、そのディレクトリのコピーは、現在のファイル数に必要な数のブロックしか使用しないため、「小さく」なります。

アップデートのリストには、リストしていないディレクトリが3つあります。 ls -al出力でそれらのサイズ(またはそれらの子孫)のサイズを比較します。

違いがある場所を見つけるには、両方のディレクトリでls -alrを試し、ファイルにリダイレクトしてから、2つの出力のdiffを試します。

12
jcaron