I'm doing an rsync from a snapshot to an empty "diffdir"
**minus** the basedir, as in "--compare-dest" in below
<rsync command> arglist = qw( --8-bit-output --acls
--archive --hard-links --human-readable --no-inc-recursive
--one-file-system --prune-empty-dirs --whole-file --xattrs ),
"--compare-dest=$base_lvh->fs_mp/.") <snapshotdir> <diffdir>
Unfortunately, it's creating *ALL* of the dirs on the source,
changed or not.
After the above was run, the "diffdir" contained 560515 dirs,
of which 386220 were empty. Deleting them freed up almost
300MB on a 600MB "diff". *ouch*.
This breaks (I'm working on a hack-around) my snapshot
script as it does a "du" of the source and expects
that the copied files should fit in a sized-to-fit
volume that is 125% of the original sources (but doesn't
when a bunch are dirs).
Anyway... only 31% of the directories it copied were
needed -- 69% of the directories were empty.
What happened? It didn't used to create such an excess...
5 years later, I detect the same problem - which is critical for me.
why has nothing happened on that bug?
--prune-empty-dirs only affects the file list that rsync is working from. That means it handles dirs that are either really empty on the source or anything that has been emptied via --exclude or --filter. Options that modify the way rsync stores stuff but not the list of stuff it is processing are not affected by --prune-empty-dirs. That would apply to the 3 --*-dest options. As long as there are files on the source that haven't been excluded or filtered they are still in the listing that rsync is processing so the directory is not empty.
The file list is pared down to remove empty directories, but the dirs in the transfer that are left are not actually empty, and thus rsync is supposed to create the directories in the transfer that have files in them, even if the files get omitted due to --compare-dest.