I've created a sparse file with dd. How do I copy contents of another file there, leaving all the zero blocks unallocated?
Asked
Active
Viewed 696 times
4
d33tah
- 1,361
- 14
- 28
-
possible duplicate of [Can a file that was originally sparse and expanded be made re-sparse](http://unix.stackexchange.com/questions/52012/can-a-file-that-was-originally-sparse-and-expanded-be-made-re-sparse) – Gilles 'SO- stop being evil' Jan 09 '13 at 23:39
-
1That question and answer are a bit unclear, but I think they show a fundamental misunderstanding. If you overwrite a file using `cp`, the overwritten file disappears. It doesn't matter if that file used to be sparse; these things are not contagious. – Tobu Jul 20 '13 at 13:40
-
Interesting, but I assume that the source file still exists. The question is if I can preserve this feature. – d33tah Jul 20 '13 at 14:01
1 Answers
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,361
- 14
- 28
-
1
-
-
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
-
3GNU `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