使用rsync仅删除无关的文件


13

比较两个目录结构并删除目标位置中无关的文件和目录的最佳方法是什么?

我有一个正在开发的小型网络照相馆应用程序。用户使用FTP添加和删除图像。我编写的网络画廊软件可以即时创建新的缩略图,但不能处理删除操作。我想做的是安排一个命令/ bash脚本以预定的时间间隔进行处理。

原始图像/home/gallery/images/使用子目录存储在相册中并组织在相册中。缩略图/home/gallery/thumbs/使用与图像目录相同的目录结构和文件名缓存在中。

我尝试使用以下方法来实现此目的:

rsync  -r --delete --ignore-existing /home/gallery/images /home/gallery/thumbs

如果所有缩略图都已被缓存,这将很好地工作,但是不能保证会发生这种情况,当发生这种情况时,thumb目录已复制了原始的全尺寸图像。

我怎样才能最好地实现自己的目标?

Answers:


8

我认为这不是rsync最好的方法。我将使用如下所示的bash单线:

$ cd /home/gallery/thumbs && find . -type f | while read file;do if [ ! -f "../images/$file" ];then echo "$file";fi;done

如果这种单行代码可以生成正确的文件列表,则可以对其进行修改以运行rm命令而不是echo命令。


谢谢汤姆。我想也要清理目录,我需要再次运行它,但是要在命令中指定目录而不是文件,并用rmdir?代替echo 。
布莱恩

@Bryan:是的,这听起来很合理。你需要更改标志的find,并在[测试]。当然,请小心我给您的命令以及所有修改,并使用echo!进行彻底测试。
汤姆·肖

非常感谢,我将在测试时应用大量回声。
布莱恩(Bryan)

1
只是有一个想法:您也可以对“ ls”进行测试,以确保它与空白一起使用。最好的祝愿。
汤姆·肖

34

您也需要--existing

rsync -r --delete --existing --ignore-existing /home/gallery/images /home/gallery/thumbs

从联机帮助页:

  --existing, --ignore-non-existing
          This tells rsync to skip creating files (including  directories)
          that  do  not  exist  yet on the destination.  If this option is
          combined with the --ignore-existing option,  no  files  will  be
          updated  (which  can  be  useful if all you want to do is delete
          extraneous files).

1
如果有任何错误,那么您的绝妙答案将不起作用。这就是为什么你还需要将添加--ignore-errors参数也是如此。那是唯一对我有用的东西。感谢您--existing--ignore-existing!我在这里以你的答案为基础。
LonnieBest

1
@LonnieBest如果有错误,即使没有rmcpmv不会起作用,否则将无法正常工作,这就是错误所在:它们是应注意的问题,并且会阻止操作成功完成。您可以指示大多数工具忽略错误(例如-f对于rm),但我不明白如何与自己相关的问题或这个答案。
Mecki
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.