多数のファイルがある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
これは、デフォルトでは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つに、後で削除された多くのファイルがあった場合、そのディレクトリのコピーは、現在のファイル数に必要な数のブロックしか使用しないため、「小さく」なります。
アップデートのリストには、リストしていないディレクトリが3つあります。 ls -al
出力でそれらのサイズ(またはそれらの子孫)のサイズを比較します。
違いがある場所を見つけるには、両方のディレクトリでls -alr
を試し、ファイルにリダイレクトしてから、2つの出力のdiff
を試します。