Is there any reason not to use use --sparse=always
with every invocation to cp
?
info cp
says:
‘--sparse=WHEN’ A “sparse file” contains “holes”—a sequence of zero bytes that does not occupy any physical disk blocks; the ‘read’ system call reads these as zeros. This can both save considerable disk space and increase speed, since many binary files contain lots of consecutive zero bytes. By default, ‘cp’ detects holes in input source files via a crude heuristic and makes the corresponding output file sparse as well. Only regular files may be sparse. The WHEN value can be one of the following:
…
‘always’ For each sufficiently long sequence of zero bytes in the input file, attempt to create a corresponding hole in the output file, even if the input file does not appear to be sparse. This is useful when the input file resides on a file system that does not support sparse files (for example, ‘efs’ file systems in SGI IRIX 5.3 and earlier), but the output file is on a type of file system that does support them. Holes may be created only in regular files, so if the destination file is of some other type, ‘cp’ does not even try to make it sparse.
It also says:
[…] with the following alias, ‘cp’ will use the minimum amount of space supported by the file system.
alias cp='cp --reflink=auto --sparse=always'
Why isn't --sparse=always
the default?
Best Answer
There are a few reasons why it is not default, one is backwards compatibility, performance, and last but not least, the principle of least surprise.
My understanding is that when you enable this option, there is CPU overhead which might not necessarily be acceptable, besides, backwards compatibility is also key. The
cp
command works reliably without, it does add a little space saving, but these days, that really is negligible, in most cases at least ...I think the comments you received also highlighted other reasons.
Principle of least surprise means you do not change something needlessly,
cp
has been around for decades, changing its default behavior will upset many veterans.