-1

I want to sync all *.sh files in exactly one sub directory. I tried this cmd but all files in a directory are synced instead of only particular file types.

rsync -vr -n --include="*.sh" --exclude="*/*/" --prune-empty-dirs /source /target

I also tried adding a filter like

--filter="+ *.sh"

but this did not change the result. Another filter

rsync -vr -n --include="*.sh" --filter="-! *.sh" --exclude="*/*/" --prune-empty-dirs

gives me an empty list. If I exclude "*" I also exclude "*.sh"... What is wrong? Thanks!

The depth should be one - the name of the subdirectory is not known. For example,

home/subdirectory1/subsubdirectory/subsubsubdirectory/file.sh
home/subdirectory1/file1.sh
home/subdirectory2/file2.sh
home/subdirectory3/file

In the above example rsync should start in home, sync directory hierarchy and only the files file1.sh and file2.sh

  • 1
    What do you mean by "in exactly one sub directory"? Do you mean you know what subdirectory the files are in? If so, what's the name or path of that directory? – Kusalananda Sep 25 at 10:33
  • 3
    Welcome to the site. Why did you use the -r option if you don't want to descend into all subdirectories (you said "in one subdirectory")? Would rsync -v /source/*.sh /target not do the trick? – AdminBee Sep 25 at 11:11
  • You write, "rsync only special file types" and then you say you want to copy *.sh files. The word special has a particular meaning (devices, pipes, etc.). On the other hand, *.sh files aren't special; they just have three characters on the end of the filename. – roaima Sep 25 at 15:53
  • You're right! Sorry for making my first question not clear enough! Note to me: always add an example for clarification... – Alexander Fieroch Sep 28 at 9:31
1

Your examples don't seem to match your description. I think what you are saying you want is this,

  • match all the *.sh files in an unknown subdirectory immediately underneath your /home
  • put the files in the unknown subdirectory on the target
  • do not include /home in the destination path

Looking from /home, this command will match all files */*.sh and copy them and their partial paths to the target. (Remove the --dry-run if you are happy with the intended result.)

rsync --dry-run -avR /home/./*/*.sh /target

For example, /home/subdir/file.sh will be copied to /target/subdir/file.sh

| improve this answer | |
  • 1
    That's it! Can't believe that it's so easy and I got lost with unnecessary --include/--exclude! Thank you very much for pointing me back to the track! – Alexander Fieroch Sep 28 at 9:35
  • @AlexanderFieroch pleased it works for you. The --relative (-R) flag can be really useful in these kind of situations, particularly with its /./ place marker – roaima Sep 28 at 9:45
  • 1
    Yes, I tried -R and /./ with and without - great flags in this situation that simplify a lot. Thanks! – Alexander Fieroch Sep 29 at 10:59

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.