最近我需要删除大量文件(超过 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
和--force
rsync 选项,但似乎都没有按照我的预期工作:
--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”删除文件夹?,这本质上是在问同样的问题。答案之一建议执行rsync
in 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
不理想但可以完成工作。