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

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

最近我需要删除大量文件(超过 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-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)

有没有办法模仿移动一次性使用 rsync 吗?

答案1

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

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

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

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

答案2

我在 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

不理想但可以完成工作。

相关内容