使用rsync删除单个文件

21

远程机器上存在文件foo.txt:/home/user/foo.txt

本地机器上不存在该文件。

我想使用rsync删除foo.txt。

由于我无法查找本地或远程计算机上/home/user中的其他文件(并且为了本问题的目的,假设我无法查找),因此不能同步整个目录。

我应该使用什么rsync命令来删除远程计算机上的foo.txt?

5个回答

32

尝试这个:

rsync -rv --delete --include=foo.txt '--exclude=*' /home/user/ user@remote:/home/user/

非常建议先使用 --dry-run 进行测试,以确保安全。虽然使用 SSH 看起来会更容易...

ssh user@remote "rm /home/user/foo.txt"

1
无法使用SSH进行此操作。(这是一个政策问题,而不是技术问题。;)) - dirtside
显然,由于本地文件不存在,我们无法将其指定为要传输的源文件。唯一的方法是同步整个目录,任何缺失的远程文件都会被删除。我想是这样的。 - dirtside
太棒了!就是它。我发誓我之前试过那个精确的表达方式,但我想是我记错了。谢谢 :) - dirtside
现在,我们如何处理子目录中的文件? - Elle Mundy
1
@ElleMundy 这可能是一个好问题,可以单独提出来问。 - David Z
显示剩余2条评论

6

这可能有点琐碎,但如果像我一样,您正在寻找一种使用rsync从远程服务器删除目录内容的方法,那么这就是我的做法:

  1. 创建一个空的模拟文件夹:

    mkdir mock

  2. 与它同步:

    rsync -arv --delete --dry-run ~/mock/ remote_server:~/dir_to_clean/

  3. 从上面的行中删除--dry-run以实际执行操作。


1
+1,但添加-r以递归到子目录。在我们的colo设施备份服务器上,只允许使用scp、sftp和rsync。有一些过时的庞大网站需要删除,rsync解决了这个问题(如果使用sftp,可能需要花费数天时间;-))。 - virtualeyes
1
简而言之,递归删除所有命令为:"rsync -rv --delete --force /empty/ remote:empty-me/" - virtualeyes
3
如果您使用了"-a"选项,则隐含使用"-r"选项。 "-a" = "-rlptgoD" <参见:http://rsync.samba.org/ftp/rsync/rsync.html> - Swivel

2
我刚遇到了同样的问题,需要使用rsync删除一个远程文件,因为只允许使用rsync而不允许使用其他SSH命令。--remove-source-files选项(曾被称为--remove-sender-files)正是做这件事的。请注意保留HTML标签。
rsync -avPn --remove-source-files remote:/home/user/foo.txt .
rm foo.txt

一如既往,删除-n选项以真正执行此操作。


真正的跳出思维定势的优秀示例!使用遥控器作为源,而非目的地。 - Amfasis

0
如上所建议,使用--dry-run进行测试。根据rsync手册,--delete会删除远程位置上的文件。
rsync -rv --delete user@hostname.local:full/path/to/foo.txt

在下面评论指出,仅列出的命令是不正确的。要仅列出,请使用--list-only并删除--delete


0
在您的远程主机上,创建两个目录toDelete和emptyDir。将您要删除的文件fileToBeDeleted移动到toDelete目录中,删除toDelete目录的内容,然后删除toDelete和emptyDir目录。
  ssh "$remoteHost" \
                "cd $backupDir && mkdir toDelete emptyDir && \
                sudo rsync -av --remove-source-files ./fileToBeDeleted ./toDelete &&\
                sudo rsync -av --delete  ./emptyDir/ ./toDelete &&\
                rmdir emptyDir toDelete"

为了使这个解决方案起作用,您的远程用户应该能够无需密码使用sudo rsync,并通过ssh进行连接。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接