使用 rsync 移动文件夹时如何删除空的源目录?

yll*_*ate 13 shell bash rsync zsh

rsync可以mv使用以下选项非常相似地将文件夹哄入移动文件夹中,并且优于传统文件夹:

rsync -axvvES --remove-source-files source_directory /destination/
Run Code Online (Sandbox Code Playgroud)

但是,我似乎还无法完成的一件事是删除原始目录。该--remove-source-files标志就是这样做的,删除源文件,但不删除源目录。我也希望有--remove-source-directories一面旗帜,但没有。

我该如何处理? 我想我可以rm -fr在移动后发出一个,但是我更愿意将整个过程保持在一个过程中,而不是引入潜在的错误。

小智 11

我最终遇到了类似的情况。我想避免rm -rf,知道 rsync 无法复制某些文件,而且我不想丢失它们。

为了简单地删除空目录,我发现这是最方便的(来自sourcedir):

find . -type d -empty -delete
Run Code Online (Sandbox Code Playgroud)


Raú*_*udo 7

使用“ rm -rf ”具有固有的竞争条件,您可以即删除刚刚在rsyncrm调用之间创建的文件。

我更喜欢使用:

rsync --remove-source-files -a server:incoming/ incoming/ && 
ssh server find incoming -depth -type d -delete
Run Code Online (Sandbox Code Playgroud)

如果目录不为空,这将不会删除目录。


Ali*_*xel 4

我还没有找到一个命令可以一次性执行此操作,但由于 rsync 的性能仍然比rm -rf(特别是如果您有大量目录)更好,这里有两个执行“移动”的 rsync 命令:

rsync -av --ignore-existing --remove-source-files source/ destination/ && \
rsync -av --delete `mktemp -d`/ source/ && rmdir source/
Run Code Online (Sandbox Code Playgroud)