Move only files recursively from multiple directories into one directory with mv

user1067257 picture user1067257 · Nov 9, 2013 · Viewed 8.4k times · Source

I currently have ~40k RAW images that are in a nested directory structure. (Some folders have as many as 100 subfolders filled with files.) I would like to move them all into one master directory, with no subfolders. How could this be accomplished using mv? I know the -r switch will copy recursively, but this copies folders as well, and I do not wish to have subdirectories in the master folder.

Answer

gniourf_gniourf picture gniourf_gniourf · Nov 9, 2013

If your photos are in /path/to/photos/ and its subdirectories, and you want to move then in /path/to/master/, and you want to select them by extension .jpg, .JPG, .png, .PNG, etc.:

find /path/to/photos \( -iname '*.jpg' -o -iname '*.png' \) -type f -exec mv -nv -t '/path/to/master' -- {} +

If you don't want to filter by extension, and just move everything (i.e., all the files):

find /path/to/photos -type f -exec mv -nv -t '/path/to/master' -- {} +

The -n option so as to not overwrite existing files (optional if you don't care) and -v option so that mv shows what it's doing (very optional).

The -t option to mv is to specify the target directory, so that we can stack all the files to be moved at the end of the command (see the + delimiter of -exec). If your mv doesn't support -t:

find /path/to/photos \( -iname '*.jpg' -o -iname '*.png' \) -type f -exec mv -nv -- {} '/path/to/master' \;

but this will be less efficient, as one instance of mv will be created for each file.

Btw, this moves the files, it doesn't copy them.

Remarks.

  • The directory /path/to/master must already exist (it will not be created by this command).
  • Make sure the directory /path/to/master is not in /path/to/photos. It would make the thing awkward!