Linux ‘find’ command: How to find and copy files

Linux find/copy FAQ: How can I use the find command to find many files and copy them all to a directory?

I ran into a situation this morning where I needed to use the Linux find command to (a) find all the MP3 files beneath my current directory and (b) copy them to another directory. In this case I didn't want to do a cp -r command or tar command to preserve the directory structure; instead, I wanted all of the files to end up in the same directory (so I could easily import them into iTunes).

In short, here's the find command I used to find and copy all of those files:

find . -type f -name "*.mp3" -exec cp {} /tmp/MusicFiles \;

If you're familiar with the find command and have used the -exec option before, the only thing hard about this command is knowing where to put the curly braces and the \; in the command.

A few points:

  1. In this example, all the MP3 files beneath the current directory are copied into the target directory (/tmp/MusicFiles). Again, this isn't a cp -r command; all of these files will end up in one folder.
  2. As a result, if there are duplicate file names, some of the files will be lost.
  3. If you don’t want to overwrite existing files, use the cp -n command, like this:
find . -type f -name "*.mp3" -exec cp -n {} /tmp/MusicFiles \;

The -n option of the cp command means “no clobber,” and you can also type that as cp --no-clobber on some systems, such as Linux. (The -n option appears to work on MacOS systems, but --no-clobber does not.) Be sure to test this command before using it on something important; I haven’t tested it yet, I just read the man page for the cp command.)

If you ever need to use the Linux find command to find a large collection of files and copy them to another location, I hope this has been helpful.

Another example: Find and move

Here’s another example of a “find and copy” command I just used, though in this case it was a “find and move” command. In this case I had a bunch of files (with unique names) in subdirectories, and used this command to copy them all to the current directory:

find . -type f -exec mv {} . \;

As before, this is a dangerous command, so be careful. With this command, if you have duplicate filenames, you will definitely lose data during the move operations.