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

时间:2012-04-28 15:37:44

标签: linux copy filesize cp

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

这是什么意思?怎么避免?它改变文件吗?

此外还有一些其他奇怪的行为。如果我将文件A处理到文件B并尝试立即检查B的大小,则它给出0或例如6.2M,一段时间后,B的大小为7.0M且不变。我有可能捕获一些复制的中间结果吗?为什么那么慢?

2 个答案:

答案 0 :(得分:4)

假设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

答案 1 :(得分:1)

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包。