8

rsync can be coaxed into moving folders very similarly and superiorly to traditional mv with the following options:

rsync -axvvES --remove-source-files source_directory /destination/

However one thing I cannot yet seem to get it to do is to remove original directories. The --remove-source-files flag does just that, removes the source files, but not also source directories. I wish there were a --remove-source-directories flag as well, but there's not.

How can I deal with this? I suppose I can just issue an rm -fr after the move, however I'd prefer to keep the procedure all in one process vs introducing a potential for mistakes.

  • What is your reason for not using mv? – Nils Apr 28 '12 at 20:04
  • 1
    Different volumes and I need to preserve all attributes, including times. – ylluminate Apr 28 '12 at 20:12
  • 1
    Same need here unix.stackexchange.com/q/78375/3858. – Alix Axel Jun 7 '13 at 22:17
  • 1
    I'm very surprised rsync has no option for this, especially when it does at the destination side. I end up doing find . -type d -empty | xargs rmdir -p – Sridhar Sarnobat May 7 at 2:24
  • You know @Sridhar-Sarnobat I can't help but wonder if there's a way to pass results from an rsync session into a list that is then processed following the process that then cleans it up... Hmm. – ylluminate May 7 at 2:27
4

I haven't found a command that does that in one go, but since rsync still performs better than rm -rf (specially if you have a very large number of directories) here are two rsync command that do a "move":

rsync -av --ignore-existing --remove-source-files source/ destination/ && \
rsync -av --delete `mktemp -d`/ source/ && rmdir source/
5

Using "rm -rf" has an inherent race condition, you could namely delete files that were just created between the rsync and the rm invocations.

I prefer to use:

rsync --remove-source-files -a server:incoming/ incoming/ && 
ssh server find incoming -type d -delete

This will NOT remove the directories if they are not empty.

  • Note you apparently may need to add -depth on OSX or others. – Charlie Gorichanaz Apr 27 '17 at 20:08
2

Why not just add rm -rf source_directory after your rsync ?

rsync -axvvES --remove-source-files source_directory /destination/ && rm -rf source_directory

Each command-line program is (idealy) made to do a specified task, and it's up to you to glue several together to accomplish more complex tasks.

  • 2
    I think you're right. I believe I ultimately have to drill down to the bottom as well first as I cannot get caught just moving the way rsync normally does. Probably need to use find -depth. Would you have any suggestion as to a quick algorithmic approach to getting down to the bottom of the dir stack, mv'ing with rsync, rm'ing as you note, and then stepping back up the tree? – ylluminate Apr 29 '12 at 4:48
2

I ended up in a similar situation. I wanted to avoid rm -rf, knowing that rsync failed to copy some files, and I didn't want to loose them.

To simply delete the empty directories, I found this one the most convenient (from sourcedir):

find . -type d -empty -delete
  • Yep, thank goodness for -empty, which I only found out recently and it's become very common for me to use. – Sridhar Sarnobat Aug 26 at 19:37

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.