Search code examples
linuxfilecopyrsyncflat

Rsync make flat copy


I'm trying to write a script that copy all the files of one dir (with subdirs) to the root of another dir.

So Imagine I have this file structure:

/
pic.JPG
PIC5.JPG
FOLDER
  pic2.JPG
  pic3.JPG
  FOLDER2
    pic4.JPG

I want all the .JPG files from that directory and copy them over to another destination. But I don't want the directory structure, just the files.

This is what I've got:

"sudo rsync -aq  --include '*/' --include '*.JPG' --exclude '*\' /source/picturesRoot/ /destination/flatView/

But it also copies the directories :( I found this link on stackoverflow: rsync : Recursively sync all files while ignoring the directory structure

I looked at the solution and didn't see much difference with my command, apart from the * and . in the path. I tried it but it didn't work.

I hope somebody can help me, thanks.


Solution

  • This answer cannot work for you because your pictures are not at the same level in directories. There is no option in rsync to skip the creation of directory structure. In the link you gave, it's working because the user explicitly select source files with *.

    You can try something with find and rsync. Find will find files and rsync copy them.

    Here is a solution :

    find /source/picturesRoot -type f -name "*.JPG" -exec rsync -a {} /destination/flatView/ \;
    

    Be careful, if two files have the same name just one will be in destination directory.