Merge two directories recursively
Problem
I want to copy all the contents of a directory (or folder) named source-folder into another directory named destination-folder.
Let’s walk-through an example below.
Assume source-folder contains:
file1.txt
file2.txt
directory1/file3.txt
directory2/file4.txt
And destination-folder contains:
file5.txt
directory1/filexyz.txt
directory2/file4.txt
The final structure I want in destination-folder should be:
file1.txt
file2.txt
file5.txt
directory1/file3.txt
directory1/filexyz.txt
directory2/file4.txt
- The
directory2/file4.txtwill be the original that was already indestination-folder, hence ignoring the one from thesource-folder.
Solution
An easy solution is to use the rsync command line tool, available in most Linux/Unix systems.
rsync -av --ignore-existing source-folder/* destination-folder/
Without the /* it just copies the source folder itself into the destination!
So, you would end up with source-folder under the destination-folder/.
Note: According to https://unix.stackexchange.com/a/149986 the wildcard is not needed, but the trailing slash is.
Detailed explanation
rsync: This is the command-line utility used for synchronizing files and directories between different locations, either on the same system or between different systems.-av: Combines the following two options:-a(or--archive): This option is used to achieve archive mode, which is essentially a combination of several other options like-r(recursive),-l(copy symlinks as symlinks),-p(preserve permissions),-t(preserve modification times), and more. It’s a convenient way to ensure that files are copied with their metadata and properties preserved.-v(or--verbose): This option enables verbose mode, meaning that rsync will display detailed information about the files being transferred and the progress of the synchronization.
--ignore-existing: This option tells rsync to skip copying files that already exist in the destination folder. If a file with the same name exists in the destination, it won’t be overwritten or updated.