Syncing multiple sub-directories to one directory

Rob Campbell robcampbell08105 at
Tue Sep 29 23:46:36 UTC 2020

Thanks for your help.  What you provided didn't work for me because that
still placed things in subdirectories.

I figured it out.  This puts it all in the images directory.

find /my/phone/root/dir/ \( -path '*Duo*' -o -path '*DCIM*' -o -path
'*Pictures*' -o -path '*Camera*' -o -path "*Download*" -o -path
"*textgram*" -o -path "*WhatsApp*" ! -path '*.textgram*' ! -path
'*.thumbnails*' \) -type f \( -iname '*.jp*g' -o -iname '*.png' -o -iname
'*.dng' -o -iname '*.raw' -o -iname '*.raw' \) -exec rsync -uz --progress
"{}" /my/backup/directory/for/images/ \;

When you are principled, set standards and stick to them some people will
fall out of your life; let them!

On Tue, Sep 29, 2020 at 1:33 PM Wayne Davison <wayne at> wrote:

> On Tue, Sep 29, 2020 at 7:38 AM Rob Campbell wrote:
>> I would like to sync many subdirectories into one directory with no
>> subdirectories. I've tried
>> rsync -rv --progress --include '*.jp*g' --include '*.png' --include
>> '*.dng' --include '*.raw' --include '*.nef' --include 'Duo' --include
>> 'DCIM' --include 'WhatsApp' --exclude '*' /my/phone/root/dir/
>> /my/backup/directory/for/images/
> You didn't specify what isn't working as you expect. That command works
> fine for the 3 listed dir names as long as you either don't have matching
> files inside /my/phone/root/dir (or as long as it's ok to also copy those
> files) and as long as there aren't subdirs or files named the same as the 3
> top dirs you included. The latter can be fixed by anchoring your dir names
> and making them only match a dir (e.g. --include '/Duo/').  If you want to
> have the copy avoid files in the top dir you can either change all the
> file-based includes to have a "*/" prefix (such as "--include '*/*.png'
> ...") or you can change the dir includes into args and exclude '*/*'
> instead of "*".  The last option would look like this (I also tossed in -i):
> rsync -riv --progress --include '*.jp*g' --include '*.png' --include
> '*.dng' --include '*.raw' --include '*.nef' --exclude '*/*'
> /my/phone/root/dir/{Duo,DCIM,WhatsApp} /my/backup/directory/for/images/
> That assumes you've got bash to do the brace expansion, but you could
> change that into 3 arg paths if you need to. You may also want to add --del
> if you want rsync to delete inside the 3 listed dirs.
> I'm not sure why you listed an extra command with "NewDir" when it's not
> mentioned in the first command.  If that is an indication that you really
> want to copy all dirs under root/dir (not just the 3 named dirs in the
> first command) then you could use an include of "/*/" to match any dir in
> the root of the transfer, like this:
> rsync -riv --progress --include '*.jp*g' --include '*.png' --include
> '*.dng' --include '*.raw' --include '*.nef' --include '/*/' --exclude '*'
> /my/phone/root/dir/ /my/backup/directory/for/images/
> One last suggestion, I like to make the args shorter by using -f (filter)
> commands, so an include example is -f '+ *.png' and an exclude example is
> -f '- /*/' (those are identical to the equivalent include/exclude args, so
> that's just personal preference).
> ..wayne..
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <>

More information about the rsync mailing list