Bug 10748 - 3.1.0 and 3.1.1 create all dirs on target even with --prune-empty-dirs
Summary: 3.1.0 and 3.1.1 create all dirs on target even with --prune-empty-dirs
Alias: None
Product: rsync
Classification: Unclassified
Component: core (show other bugs)
Version: 3.1.1
Hardware: All All
: P5 major (vote)
Target Milestone: ---
Assignee: Wayne Davison
QA Contact: Rsync QA Contact
Depends on:
Reported: 2014-07-29 05:37 UTC by Linda Walsh
Modified: 2020-07-27 22:00 UTC (History)
0 users

See Also:


Note You need to log in before you can comment on or make changes to this bug.
Description Linda Walsh 2014-07-29 05:37:41 UTC
I'm doing an rsync from a snapshot to an empty "diffdir"
**minus** the basedir, as in "--compare-dest" in below
args... :

<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...
Comment 1 walter 2019-02-26 13:51:53 UTC
5 years later, I detect the same problem - which is critical for me.

why has nothing happened on that bug?
Comment 2 Kevin Korb 2019-02-26 16:37:21 UTC
--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.
Comment 3 Wayne Davison 2020-07-27 22:00:26 UTC
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.