为什么用cp命令复制的目录比原来的小?

Hir*_*103 19 mac command-line cp du

我想将一个包含大量文件的目录复制到另一个目的地。我做了:

cp -r src_dir another_destination/
Run Code Online (Sandbox Code Playgroud)

然后我想确认目标目录的大小和原来的一样:

du -s src_dir
3782288 src_dir

du -s another_destination/src_dir
3502320 another_destination/src_dir
Run Code Online (Sandbox Code Playgroud)

然后我想到可能有几个符号链接没有跟在cp命令后面并添加了-a标志:

-a 与 -pPR 选项相同。保留文件的结构和属性,但不保留目录结构。

cp -a src_dir another_destination/
Run Code Online (Sandbox Code Playgroud)

du -s给了我同样的结果。有趣的是,源和目标都具有相同数量的文件和目录:

tree src_dir | wc -l
    4293

tree another_destination/src_dir | wc -l
    4293
Run Code Online (Sandbox Code Playgroud)

我做错了什么,我用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
Run Code Online (Sandbox Code Playgroud)

当我查看带有 的文件时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
Run Code Online (Sandbox Code Playgroud)

Mat*_*lis 21

这是因为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
Run Code Online (Sandbox Code Playgroud)

即使文件只有 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
Run Code Online (Sandbox Code Playgroud)

总之,要确认所有文件被复制,你会使用du -sb替代du -s

  • @val:BTRFS 压缩不会影响`du` 输出:这会使压缩文件对于使用通常的长度算法的程序看起来很稀疏!= 使用块。https://btrfs.wiki.kernel.org/index.php/Compression#Why_does_not_du_report_the_compressed_size.3F (2认同)

jca*_*ron 12

这可能是由于目录“文件”的大小。

在大多数文件系统中,在磁盘上,目录很像常规文件(大多数情况下只有名称和节点编号的列表),随着它的增长使用更多块。

如果添加许多文件,目录本身就会增长。但是如果你之后删除它们,在许多文件系统中,目录不会缩小。

因此,如果原始树中的一个目录在某个时候有许多文件,这些文件后来被删除,则该目录的副本将“更小”,因为它仅使用当前文件数量所需的块数。

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

要找到不同之处,您可以ls -alr在两个目录上尝试一个,重定向到一个文件,然后尝试diff两个输出中的一个。