2012-04-28 30 views
2

我遇到了以下問題。當我在Linux中使用cp命令將文件A複製到文件B時,這些文件的大小是不同的,例如, A是6.4M,而B是7.0M。即使我在同一目錄中執行此操作(以避免不同驅動器上的塊大小不同),也會發生這種情況。使用cp時文件大小發生變化

這是怎麼回事?如何避免?它會改變文件嗎?

另外還有一些奇怪的行爲。如果我將文件A應用於文件B並嘗試立即檢查B的大小,則它給出0或例如6.2M,一段時間後B的大小爲7.0M並且恆定。是否有可能捕獲一些中間複製結果?那爲什麼這麼慢?

+4

圖片或它沒有發生。 – 2012-04-28 15:39:40

+3

這可能會發生在稀疏文件中,具體取決於您如何確定「文件大小」。 – Mat 2012-04-28 15:40:24

+0

那麼它會更改文件(其內部結構)?它如何影響二進制文件? – user938720 2012-04-28 15:42:23

回答

4

假設coreutilsducp

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

有一定數量的臭蟲與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

所以我懷疑馬車CP Coreutils的任何試圖使用FIEMAP和內核中的buggy文件系統無法正確處理FIEMAP。升級你的內核和coreutils軟件包。

+0

感謝您的評論。我只是在XFS格式的文件系統上使用cp時遇到了這種情況,而在ext4上工作正常。時間來重新格式化很多文件系統... – 2013-12-15 17:28:55

相關問題