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

Ali*_*xel 17 bash rsync rm synchronization files

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

rsync -av --delete `mktemp -d`/ ~/source && rmdir ~/source
Run Code Online (Sandbox Code Playgroud)

是最优化的方法之一,我可以保证它比rm -rf.

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

rsync -av --ignore-existing --remove-source-files ~/source ~/destination
Run Code Online (Sandbox Code Playgroud)

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

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

直线mv几乎会立即完成,但我的~/destination目录中有应该保留的文件,所以mv不是一个选项。我找到了--prune-empty-dirs--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)
Run Code Online (Sandbox Code Playgroud)

有没有办法一次性模仿rsync的动作

mit*_*mit 10

从 zany 的评论到 slm 的回答(使用 rsync 移动文件和删除目录?)我会推荐这两个命令作为答案:

rsync -av --ignore-existing --remove-source-files source/ destination/ && \
find source/ -depth -type d  -empty -exec rmdir "{}" \;
Run Code Online (Sandbox Code Playgroud)

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

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

  • 为什么不直接使用“-delete”而不是“-exec rmdir {} \;”? (2认同)
  • 当rsync中断时,find永远不会开始还是不开始?因此第二次 rsync 中的 -delete 应该不是问题。但是 -delete 也会删除文件,而 rmdir 从不删除文件,只删除目录。两者(-delete 和 rmdir)都会在删除之前检查目录是否为空。 (2认同)

slm*_*slm 7

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

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

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

$ rsync -axvvES --remove-source-files source_directory /destination/ && \
  rm -rf source_directory
Run Code Online (Sandbox Code Playgroud)

不理想,但可以完成工作。

  • 使用 `rsync` 修剪目录感觉不对,而且使用 `rm -rf` 总是存在危险。我建议第二步是:`find source/ -d -type d -exec rmdir {} \;` (3认同)
  • 我只是觉得有必要补充一点,永远不要在单个 rsync 命令中使用 `-delete` 和 `--remove-source-files`(上面的例子很好,这是切线的)。如果您中断然后重新执行我所描述的内容,您将丢失传输的文件。我以前做过:( (3认同)