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.
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.
/path/to/master
must already exist (it will not be created by this command)./path/to/master
is not in /path/to/photos
. It would make the thing awkward!