4

I've created a sparse file with dd. How do I copy contents of another file there, leaving all the zero blocks unallocated?

d33tah
  • 1,371
  • 14
  • 28

1 Answers1

3

The solution is apparently to use cp --sparse=always. My first attempt was with writing some Python code, but unfortunately the MD5 sums didn't match (could anyone tell me why? the code's in edit history).

d33tah
  • 1,371
  • 14
  • 28
  • 1
    The filesystem block size usually isn't 512B - more often it is 4KB. – peterph Jan 09 '13 at 22:05
  • You say that might be the reason that MD5 sums didn't match? – d33tah Jan 09 '13 at 22:10
  • No, filesystem gives you zeros where it finds an unallocated block, so the error had to be in your script. The block size is important for other reason: if you seek by 6 empty 512B sectors, then one with some data an then again seek say 4 empty sectors, you save nothing, because the data in the one sector causes the fs to allocate whole 4K block. – peterph Jan 09 '13 at 22:35
  • 3
    GNU tar also has the -S, --sparse option to handle sparse files effectively, btw. – peterph Jan 09 '13 at 22:36
  • @d33tah your python code is losing a byte every time it seeks because of the -1 in the seek target, which isn't necessary. You should seek ahead a full 512 bytes each time. –  Jul 20 '13 at 17:37