15

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.

mit
  • 1,844
  • 6
  • 29
  • 42
ylluminate
  • 1,001
  • 2
  • 15
  • 29

4 Answers4

12

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
lp_
  • 221
  • 2
  • 2
7

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 -depth -type d -delete

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

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/
Alix Axel
  • 2,653
  • 6
  • 28
  • 28
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.

Gregory MOUSSAT
  • 1,737
  • 2
  • 25
  • 48
  • 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 04:48