Recursively copy files from one directory to another

Use:

find /media/kalenpw/MyBook/Music/ -name '*.mp3' -exec cp {} /media/kalenpw/HDD/Music \;

The reason for your command not working is that names containing wildcards (*.mp3) are expanded before the command is run, so if you had three files (01.mp3, 02.mp3, 03.mp3) your effective command was:

cp -R /media/kalenpw/MyBook/Music/01.mp3 /media/kalenpw/MyBook/Music/02.mp3 /media/kalenpw/MyBook/Music/03.mp3 /media/kalenpw/HDD/Music

As you can see -R has no effect in this case.


You have specifically mentioned the files(s)/directory(ies) to be copied as using *.mp3 i.e. any file/directory name ending in .mp3.

So any file ending in .mp3 in /media/kalenpw/MyBook/Music/ directory and similarly, any directory ending in .mp3 in /media/kalenpw/MyBook/Music/ will be copied, recursively. If there is no such matched file/directory, nothing will be copied.

Now to copy all .mp3 files from /media/kalenpw/MyBook/Music/ recursivley to directory /media/kalenpw/HDD/Music/:

  • Using bash:

    shopt -s globstar
    cp -at /media/kalenpw/HDD/Music /media/kalenpw/MyBook/Music/**/*.mp3
    
  • Using find:

    find /media/kalenpw/MyBook/Music -type f -name '*.mp3' -exec cp -at /media/kalenpw/HDD/Music {} +