使用rsync移动文件并删除目录?


17

最近,我需要删除大量文件(超过100万个),并且我读到这样做:

rsync -av --delete `mktemp -d`/ ~/source && rmdir ~/source

是执行此操作最优化的方法之一,我可以保证它的速度比快rm -rf

我不是这方面的专家,但是据我了解,rsync性能的原因与它列出文件的方式有关(我想是LIFO而不是FIFO)。现在,问题是,我还需要以有效的方式移动大量文件。经过一番搜索,我发现了这一点:

rsync -av --ignore-existing --remove-source-files ~/source ~/destination

虽然这会删除所有移动的文件~/source,该目录留在那里。由于我具有类似“循环”的目录结构files/directories,因此其数量非常接近1,因此我被迫再次运行第一个命令以完全摆脱该目录:

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

一条直线mv几乎可以立即完成,但是我的~/destination目录中有应保留的文件,因此mv不是一种选择。我找到了--prune-empty-dirsand --forcersync选项,但似乎都不如预期:

--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)

有没有办法一口气模仿rsync 的举动


2
如果您在这里没有找到答案,请尝试在rsync列表上发布。他们非常有帮助。list.samba.org/mailman/listinfo/rsync

Answers:


7

我在标题为stackoverflow的线程上找到了该线程:用rsync“ move”删除文件夹?,这基本上是一个相同的问题。答案之一是建议执行rsyncin 2命令,因为似乎没有一个命令可以完成文件和源目录的移动/删除。

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

或者,您可以使用以下命令进行操作:

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

不理想,但能胜任。


是的,是我回答了这个问题(这个问题也有相同的“解决方案”)。= P
Alix Axel

@AlixAxel-哈,对不起,我什至没有注意到你回答了那个。那好吧。那我要删除这个答案吗?
slm

3
使用rsync修剪目录感觉不对,并始终存在的危险有rm -rf。我建议第二步是:find source/ -d -type d -exec rmdir {} \;
zany 2013年

2
我只是被迫添加,从不使用,-delete并且只能--remove-source-files在单个rsync命令中使用(上面的示例很好,这是切线的)。如果您中断然后重新执行我所描述的内容,则将丢失传输的文件。我之前做过的事:(
Sridhar Sarnobat

在使用进行清理时find,我更喜欢这样: find source/ -type d -empty -delete 它使我有一种奇怪的保证,即它不会破坏一切。
greyfade

10

从zany的注释到slm的答案(使用rsync移动文件并删除目录?),我建议使用以下2条命令作为答案:

rsync -av --ignore-existing --remove-source-files source/ destination/ && \
find source/ -depth -type d  -empty -exec rmdir "{}" \;

就像zany所说的那样,优点是,如果您使用不正确或对于初学者来说,使用rm -rf仍然存在一些危险。

我添加了-depth和-empty两个选项,虽然我不确定这是否真的必要,但是它使第二个命令在其他情况下更可移植,甚至更安全(如果某些目录不为空,并且仍然可以正确执行操作,开始从目录树的最深处删除)


为什么不只是-delete代替-exec rmdir {} \;
飞羊

@flying_sheep看到user7000的评论在SIM卡的回答是:当rsync的IST中断,你可以失去的文件
麻省理工学院

当rsync中断时,查找永远不会开始吗?因此,第二个rsync中的-delete应该不是问题。但是-delete也会删除文件,而rmdir永远不会删除文件,只会删除目录。两者(-delete和rmdir)在删除之前都会检查目录是否为空。

此外,手册页还说您应该使用-execdir而不是-exec ...
benba '17

2

这一步就可以完成工作。注意源路径和目标路径上的结尾/斜杠/。

rsync \
    -ruval \
    --ignore-existing \
    --remove-source-files \
    --prune-empty-dirs \ 
    /source/path/ /target/path/

我回响了user7000的警告,不要在--delete--remove-source-files的同一调用中一起使用rsync。如果操作失败或被中断,并且重复相同的调用,您将丢失数据。如有任何疑问,请使用该--dry-run选项查看将要执行的操作。


-ruval似乎多余。-a等价于-rlptgoD,其中包括-r-l
greyfade
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.