为什么使用命令复制的目录比原始目录复制的要小?

分享于 

5分钟阅读

电脑

 

问题:

我要将一个目录用大量文件复制到另一个目的地。 我做到了


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 默认显示的不是 file(s),的大小,而是它们所使用的磁盘空间。 你需要使用 -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



文件的长度为1 字节,但它占用的磁盘空间为1 字节。

这里外,一些文件系统支持所谓的稀疏文件,它不使用所有零块的磁盘空间。 例如:


% 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:

可能是由于目录"文件"的大小。

在大多数文件系统中,在磁盘上,目录与常规文件( 只有一个名字和 node 号码的列表) 一样,使用更多的块。

如果添加了许多文件,目录本身会增长。 但是如果在许多文件系统中删除它们,目录将不会收缩。

因这里,如果原始树中的一个目录有许多文件,那么该目录的复制将是"较小"。

更新中的列表中,有 3个目录还没有列出。 比较 ls -al 输出中的( 或者这些人的后代)的大小。

要找出不同的地方,可以在两个目录上尝试一个 ls -alr,重定向到一个文件,然后是两个输出的一个 diff



COM  COMM  DIR  Comma  cop