RSYNC不会删除源目录


27

我正在使用rsync从服务器上获取文件,然后在本地将文件从服务器上删除。我正在运行的完整命令如下。

这确实可以成功删除源服务器上的文件,但是仍然保留空目录。我没有收到任何消息或错误。所有输出正常。也许这是预期的功能。

如何告诉rsync清除所有内容,包括目录?

rsync --progress -vrzh --remove-source-files

两端的版本均为3.0.9。


Answers:


13

--remove-source-files您观察到的行为与以下行为完全相同man rsync

-删除源文件

   This tells rsync to remove from the sending side the files (meaning non-directories) that are a part of the transfer and have been successfully duplicated on the receiving side.

没有特定的命令来删除目录,因为StackExchangeServerFault中的这两个讨论清楚地表明了这一点。建议的解决方案是发出两个单独的命令:

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

在这两篇文章中建议的命令的最后一部分,

 rmdir source/

在这些帖子中,删除(已清空)源目录所需的文件具有这种形式,因为OP和答案正在使用rsync在同一台计算机中移动大量文件。在您的情况下,您将必须手动执行此操作。


5
rsync --delete建议很危险,因为它忽略了rsync未完成或源中有新文件的可能性。@slhck find下面的方法更安全。
西

29

手册甚至说:

--remove-source-files   sender removes synchronized files (non-dirs)

如果要删除源中的空目录,如果仍有剩余文件,请执行以下操作:

find . -depth -type d -empty -delete

但是对于空的根目录,rm -rf <directory>当然可以满足。


5
是的,这是唯一的解决方案。这是rsync的一个愚蠢的缺少功能... rsync知道何时处理目录中的最后一个文件...如果目录为空也很容易删除。
Erik Aronesty 2014年

4
请注意,发出“ rm -rf”很容易出现竞争情况,因此我不鼓励这样做。
劳尔·萨利纳斯-蒙塔古多

无法清除顶级空目录的变体:find some_dir -depth -type d -empty -not -path some_dir -delete
Cameron Tacklind,

5

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

我更喜欢使用:

rsync --remove-source-files -a服务器:传入/传入/ &&

ssh服务器找到输入-type d -delete

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


2
rm -rf也将删除所有未因某种原因传输的文件。
克里斯蒂安

1
该答案缺少-depth指示find按正确顺序进行处理的选项。由于这种丢失的结果,仅包含空目录(可能递归)的目录不会被删除。@slhck的变体正确。
StéphaneGourichon

1

-m, --prune-empty-dirs 从文件列表中删除空目录链

--force 即使不为空也强制删除目录


1
这只是防止rsync复制空目录。它不会删除空目录。
纳文

1

删除源文件,然后删除目录以确保安全。

# given this scenario where you generate folders 2014-01-01 etc.. that have an archive myfile.tar.gz
pushd $(mktemp -d)
mkdir 201{4..6}-{01..12}-{01..31}
for i in $(ls); do; touch $i/myfile.tar.gz;done;
# find and rsync on 10 CPU threads directories that match ./2015-*
find /tmp/tmp.yjDyF1jN70/src -type d -name '2015-*' | \
parallel \
--jobs 10 \
--progress \
--eta \
--round-robin \
rsync \
--hard-links \
--archive --verbose --protect-args \
--remove-source-files \
{} /tmp/tmp.yjDyF1jN70/dest
# now safely remove empty directories only
for i in $(ls /tmp/tmp.yjDyF1jN70/src); do; rmdir /tmp/tmp.yjDyF1jN70/src/$i; done;

有关GNU Parallel的更多信息

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.