我正在尝试将一个包含大量文件的目录复制到另一个目标。我做了:
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
答案1
这是因为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
。
答案2
这可能是由于目录“文件”的大小造成的。
在大多数文件系统中,磁盘上的目录很像常规文件(主要仅包含名称和节点号列表),随着目录的增长,会使用更多的块。
如果你添加了很多文件,目录本身就会变大。但是如果你随后删除了它们,在许多文件系统中,目录不会缩小。
因此,如果原始树中的某个目录在某个时间点包含许多文件,这些文件后来被删除,则该目录的副本将“更小”,因为它仅使用当前文件数量所需的块数。
在您更新的列表中,有 3 个目录您尚未列出。比较输出中这些目录(或其后代目录)的大小ls -al
。
要找到差异所在,您可以尝试ls -alr
在两个目录中运行,重定向到文件,然后diff
对两个输出进行操作。