Recently I needed to delete a large number of files (over 1 million) and I read that doing:
rsync -av --delete `mktemp -d`/ ~/source && rmdir ~/source
Was one of the most optimized ways to do that, and I can vouch that it's faster than rm -rf
.
I'm not an expert on the matter, but from my understanding the reason for rsync performance has something to do the way it lists files (LIFO instead of FIFO I suppose). Now, the problem is, I also need to to move a large number of files in a efficient way. After searching a bit, I found this:
rsync -av --ignore-existing --remove-source-files ~/source ~/destination
While this deletes all the moved files in ~/source
, the directories remain there. Since I have a "round-robin"-like directory structure the number of files/directories
is very close to 1, so I am forced to run the first command again to get rid of the directory entirely:
rsync -av --ignore-existing --remove-source-files ~/source ~/destination && \
rsync -av --delete `mktemp -d`/ ~/source && rmdir ~/source
A straight mv
would finish virtually instantly, but my ~/destination
directory has files that should be kept, so mv
is not an option. I found the --prune-empty-dirs
and --force
rsync options, but neither seem to work as I would expect:
--force force deletion of directories even if not empty
--prune-empty-dirs prune empty directory chains from the file-list
--remove-source-files sender removes synchronized files (non-dirs)
Is there a way to mimic a move with rsync in one go?