使用cp时文件大小发生变化

我遇到以下问题。 当我在Linux中使用cp命令将文件A复制到文件B时,这些文件的大小是不同的,例如A是6.4M,B是7.0M。 即使我在相同的目录中执行此操作也是如此(以避免不同驱动器上的块大小不同)。

这是关于什么的? 如何避免? 它会改变文件吗?

另外还有一些奇怪的行为。 如果我把文件A对应到文件B并且试图立即检查B的大小,那么它给出0或者例如6.2M,一段时间之后B的大小是7.0M并且是恒定的。 是否有可能捕获一些中间复制结果? 那为什么这么慢?

假设coreutils ducp

cp复制一个文件时,它试图使用启发式来保持其“稀疏”。

默认情况下,稀疏的SOURCE文件被粗糙的启发式检测到,相应的DEST文件也被稀疏。

所以,如果启发式失败, cp将创建一个纯文件,没有漏洞。 在这种情况下,复制的磁盘使用量将大于源的磁盘使用量,但是明显的文件大小应该是相同的,并且内容应该是相同的(尝试cmp )。

使用stat来查看文件的外观大小和磁盘使用情况(加上更多信息)。

 $ dd if=/dev/zero of=./sparse bs=1 count=1 seek=10240000 1+0 records in 1+0 records out 1 byte (1 B) copied, 1.4101e-05 s, 70.9 kB/s $ cp sparse copy1 $ cp --sparse=never sparse copy2 $ ll -rw-r--r-- 1 me users 10240001 Apr 28 17:59 copy1 -rw-r--r-- 1 me users 10240001 Apr 28 18:00 copy2 -rw-r--r-- 1 me users 10240001 Apr 28 17:59 sparse $ du sparse copy* 4 sparse 4 copy1 10004 copy2 $ stat sparse copy* File: `sparse' Size: 10240001 Blocks: 8 IO Block: 4096 regular file ... File: `copy1' Size: 10240001 Blocks: 8 IO Block: 4096 regular file ... File: `copy2' Size: 10240001 Blocks: 20008 IO Block: 4096 regular file $ cmp sparse copy1 && echo identical identical $ cmp sparse copy2 && echo identical identical 

有一些FIEMAP的错误:

http://lwn.net/Articles/429349/

http://lkml.indiana.edu/hypermail/linux/kernel/0906.1/00436.html

http://www.spinics.net/lists/linux-ext4/msg24337.html

所以我怀疑从coreutils的错误cp尝试使用FIEMAP和内核中的一个错误的文件系统,不正确处理FIEMAP。 升级你的内核和coreutils软件包。