rsync all directories that start with a specific digit

31,940

What you proposed should actually work:

rsync -rzvvhP remotehost:/home/tmp/1\* /home/tmp/

(You can get away with not quoting the * in most circumstances, as the pattern remotehost:/home/tmp/1\* is unlikely to match any file so it will be left alone with most shell setups.)

Your attempt with --exclude='*' failed because the first match applies, and your first match for everything (*) says to exclude.

See this guide for some general principles about rsync filters. Here, to include only directories beginning with 1 at the toplevel, and copy everything in included subdirectories, include /1 then exclude /*.

rsync -rzvvhP --include='/1' --exclude='/*' remotehost:/home/tmp/ /home/tmp/
Share:
31,940

Related videos on Youtube

rakzat
Author by

rakzat

Updated on September 18, 2022

Comments

  • rakzat
    rakzat over 1 year

    I have directory loaded with thousands of sub directories:

    /home/tmp/
              1
              12
              123
              1234
              2345
              234
              3456
              345
              34
    

    Each subdirectory in turn has hundreds of subdirectories that I want to rsync if the first level subdirectory matches...

    What I need is a way to copy/rsync only the directories that start with a given digit [1-9]...

    What I think I want is basically something that would allow me to use wild cards to match

    rsync -rzvvhP remotehost:/home/tmp/1* /home/tmp/
    

    I want rsync to sync up the

    /home/tmp/1/
    /home/tmp/12/
    /home/tmp/123/
    /home/tmp/1234/
    

    directories and any child subdirectories they have but not any of the first level directories that start with a different digit...

    /home/tmp/234/
    /home/tmp/2345/
    ........./3*/
    ........./4*/ etc..
    

    What I've tried:

    rsync -rzvvhP --exclude='*' --include-from=1.txt remotehost:/home/tmp/ /home/tmp/
    

    where 1.txt contains:

    1
    12
    123
    1234
    

    When I do this with 2.txt though rsync still seems to run through all the directories that start with 1 and 3 etc...

    How can I do this so that I can have one command to rsync only the directories that start with any given digit?

    • user
      user over 11 years
      I don't know if that's your problem, but you may want to protect the asterisk from local shell expansion (before it even gets to rsync). 'remotehost:/home/tmp/1*' rather than without the single quotes.
    • Gilles 'SO- stop being evil'
      Gilles 'SO- stop being evil' over 11 years
      What is wrong with rsync -rzvvhP remotehost:/home/tmp/1* /home/tmp/?
  • rakzat
    rakzat over 11 years
    rsync -rzvvhP --size-only --filter="+ /4*/" --exclude='/*' ... is what I ended up using...the issue I believe the problem was that the exclude was coming first...changing this from an include to filter works.