How to move (and overwrite) all files from one directory to another?
LinuxUnixLinux Problem Overview
I know of the mv
command to move a file from one place to another, but how do I move all files from one directory into another (that has a bunch of other files), overwriting if the file already exists?
Linux Solutions
Solution 1 - Linux
mv -f source target
From the man page:
-f, --force
do not prompt before overwriting
Solution 2 - Linux
It's just mv srcdir/* targetdir/
.
If there are too many files in srcdir
you might want to try something like the following approach:
cd srcdir
find -exec mv {} targetdir/ +
In contrast to \;
the final +
collects arguments in an xargs
like manner instead of executing mv
once for every file.
Solution 3 - Linux
It's also possible by using rsync
, for example:
rsync -va --delete-after src/ dst/
where:
-v
,--verbose
: increase verbosity-a
,--archive
: archive mode; equals-rlptgoD
(no-H,-A,-X
)--delete-after
: delete files on the receiving side be done after the transfer has completed
If you've root privileges, prefix with sudo
to override potential permission issues.
Solution 4 - Linux
For moving and overwriting files, it doesn't look like there is the -R
option (when in doubt check your options by typing [your_cmd] --help
. Also, this answer depends on how you want to move your file. Move all files, files & directories, replace files at destination, etc.
When you type in mv --help
it returns the description of all options.
For mv, the syntax is mv [option] [file_source] [file_destination]
To move simple files: mv image.jpg folder/image.jpg
To move as folder into destination mv folder home/folder
To move all files in source to destination mv folder/* home/folder/
Use -v
if you want to see what is being done: mv -v
Use -i
to prompt before overwriting: mv -i
Use -u
to update files in destination. It will only move source files newer than the file in the destination, and when it doesn't exist yet: mv -u
Tie options together like mv -viu
, etc.
Solution 5 - Linux
In linux shell, many commands accept multiple parameters and therefore could be used with wild cards. So, for example if you want to move all files from folder A to folder B, you write:
mv A/* B
If you want to move all files with a certain "look" to it, you could do like this:
mv A/*.txt B
Which copies all files that are blablabla.txt to folder B
Star (*) can substitute any number of characters or letters while ? can substitute one. For example if you have many files in the shape file_number.ext and you want to move only the ones that have two digit numbers, you could use a command like this:
mv A/file_??.ext B
Or more complicated examples:
mv A/fi*_??.e* B
For files that look like fi<-something->_<-two characters->.e<-something->
Unlike many commands in shell that require -R to (for example) copy or remove subfolders, mv does that itself.
Remember that mv overwrites without asking (unless the files being overwritten are read only or you don't have permission) so make sure you don't lose anything in the process.
For your future information, if you have subfolders that you want to copy, you could use the -R option, saying you want to do the command recursively. So it would look something like this:
cp A/* B -R
By the way, all I said works with rm (remove, delete) and cp (copy) too and beware, because once you delete, there is no turning back! Avoid commands like rm * -R
unless you are sure what you are doing.
Solution 6 - Linux
If you simply need to answer "y" to all the overwrite prompts, try this:
y | mv srcdir/* targetdir/