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


8

rsync通过mv以下选项,可以非常传统地将其诱骗到移动文件夹中:

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

但是,我似乎无法做到的一件事是删除原始目录。该--remove-source-files标志就这样做了,除去了源文件,但也除去了源目录。我希望也有一个--remove-source-directories标志,但没有。

我该如何处理? 我想我只能rm -fr在搬家后发出一个,但是我宁愿将程序全部放在一个过程中,而不要引入潜在的错误。


您不使用的原因是什么mv
Nils 2012年

1
卷不同,我需要保留所有属性,包括时间。
ylluminate 2012年


1
我非常惊讶rsync对此没有选择,尤其是当它在目标端执行时。我最终做了find . -type d -empty | xargs rmdir -p
Sridhar Sarnobat,

您知道@ Sridhar-Sarnobat,我不禁要问,是否有一种方法可以将会话中的结果传递rsync到列表中,然后按照随后的过程对其进行处理,然后对其进行清理……嗯。
ylluminate

Answers:


4

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

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

5

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

我更喜欢使用:

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

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


请注意,您显然可能需要-depth在OSX或其他操作系统上添加。
Charlie Gorichanaz

3

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

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

find . -type d -empty -delete

是的,感谢-empty,我最近才发现它,这对我来说已经变得很普遍了。
Sridhar Sarnobat

2

为什么不只是rm -rf source_directory在rsync之后添加?

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

每个命令行程序都是(理想情况下)执行指定的任务的,这取决于您将多个粘合在一起以完成更复杂的任务。


2
我想你是正确的。我相信我最终也必须首先深入到最底层,因为我不能像普通的rsync那样陷入困境。大概需要使用find -depth。您是否对使用快速算法方法下降到目录堆栈的底部,使用rsync进行MV,您注意到的rm然后逐步退回树有任何建议?
ylluminate 2012年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.