我正在尝试执行一个rysnc,它会导致目标目录中不在源目录中的文件被删除。因此,源和目标目录中的文件数量将相同。根据谷歌搜索和其他堆栈溢出查询,我尝试了以下命令:
rsync -avz -e -d /home/web/dataprocess/testwind/*.dbf -d /home/web/newcheck/ --delete
虽然这对来自源目录的dbf文件的文件进行了rsync,但它并没有像人们所说的那样删除源目录中不存在的无关的* .dbf文件。如何才能删除目标目录中不在源目录中的额外* dbf文件?
答案 0 :(得分:0)
您的命令不起作用的原因在rsync
手册页中说明:
--delete This tells rsync to delete extraneous files from the receiving side (ones that aren't on the sending side), but only for the directories that are being synchronized. You must have asked rsync to send the whole directory (e.g. dir or dir/) without using a wildcard for the directory's contents (e.g. dir/*) since the wildcard is expanded by the shell and rsync thus gets a request to transfer individual files, not the files' parent directory. Files that are excluded from the transfer are also excluded from being deleted unless you use the --delete-excluded option or mark the rules as only matching on the sending side (see the include/exclude modifiers in the FILTER RULES section).
但是,使用rsync过滤器来保护非dbf文件不被删除,我们可以使用此命令来完成您的任务:
rsync -avz -e -d src/ -d dest/ --delete --filter="R *.dbf" --filter="P **"
答案 1 :(得分:0)
这应该可行,并且还可以正确创建复制.dbfs的子目录(并删除没有匹配项的.dbfs。)
rsync -avz -e -d /home/web/dataprocess/testwind -d /home/web/newcheck/ --delete --filter="+ */" --filter="+ *.dbf" --filter="- *"
每个文件按顺序通过过滤器,因此过滤器表示"保留子目录,保留* .dbfs,并忽略其他所有内容。" (如果更改过滤器参数的顺序,结果可能不正确。也不可能使用一个--filter传递多个过滤器,因此该命令看起来有点多余。)
运行时,您偶尔会看到一条警告消息"无法删除非空目录:某个目录"如果目标中的目录在源上不,并且该目录包含至少一个不是.dbf的文件。可以安全地忽略此警告。