Rsync --delete选项不会删除目标目录中的文件


14

我正在尝试使用中的--delete选项rsync删除目标目录中原始目录中不存在的文件

这是我正在使用的命令:

rsync -avz --ignore-existing --recursive --delete /var/www/* root@mydomaintest.com:/var/www

所以我的问题是,如何删除目标目录中所有原始目录中没有的文件?

Answers:


14

使用此命令:

rsync --archive --verbose --compress --ignore-existing --delete /var/www/ root@mydomaintest.com:/var/www

您不需要“ *”,也不要使用它。

要排除/包括文件或目录,应使用以下参数:

--exclude 'to_exclude*'
--include 'to_include*'

好吧,让我尝试一下:)
user2028856

2
那么导致--delete命令不起作用的“ *”是否起作用?
user2028856

2
看起来就是这样。:)
AB

3
--recursive-a
太多,

1
在某些情况下,“ *”可能很重要,因为它排除了以“。”开头的文件/目录。例如,当我使用rsync将git下维护的目录从开发计算机复制到生产计算机时,会使用它。我不想同步.git信息库目录或.gitignore之类的文件,而只是工作树,包括顶级以及子目录中的文件。
sootsnoot

14

您的命令无法正常工作,因为当您使用它/var/www/*作为源代码时,您的外壳正在对其执行globing操作,即外壳正在扩展*到该目录中的所有文件并逐个复制文件,因此这里的单个文件已成为源,而不是父目录。

因此,如果使用/var/www/*,则不需要--recursive选项,因为*它将导致文件被复制(以及包含其内容的所有目录),而不是包含文件的父目录。由于同样的原因,--delete它无法正常工作,因此--delete将从目标目录中删除不在源目录中的文件,但是您正在复制文件,因此不会删除文件(可能是这样)。

这将使您更加清楚:

/foo$ ls -l
-rw-rw-r-- 1 user user    0 Apr 16 17:56 egg
-rw-rw-r-- 1 user user    0 Apr 16 17:56 spam
drwxrwxr-x 2 user user 4096 Apr 16 18:14 test


/bar$ ls -l
-rw-rw-r-- 1 user user 0 Apr 16 17:56 egg
-rw-rw-r-- 1 user user 0 Apr 16 18:13 lion
-rw-rw-r-- 1 user user 0 Apr 16 17:56 spam


$ rsync -avz --ignore-existing --recursive --delete 
/foo/* /bar/

+ rsync -avz --ignore-existing --recursive --delete 
/foo/egg /foo/spam /foo/test /bar/

sending incremental file list
test/
test/hello

sent 173 bytes  received 39 bytes  424.00 bytes/sec
total size is 0  speedup is 0.00


/bar$ ls -l
-rw-rw-r-- 1 user user    0 Apr 16 17:56 egg
-rw-rw-r-- 1 user user    0 Apr 16 18:13 lion
-rw-rw-r-- 1 user user    0 Apr 16 17:56 spam
drwxrwxr-x 2 user user 4096 Apr 16 18:14 test

如您所见,我使用了源代码,/foo/*因此rsync正在执行的命令是

rsync -avz --ignore-existing --recursive --delete /foo/egg 
/foo/spam /foo/test /bar/

使用*shell进行扩展,并单独将所有文件作为源参数,而不是整个父目录(--recursive在这种情况下您也不需要)。

因此,如果要进行--delete工作,请按以下方式运行它:

rsync -avz --ignore-existing --recursive --delete 
/var/www/ root@mydomaintest.com:/var/www/

4
指出实际问题的出色解释:使用'*'扩展源列表。
Antonio Bardazzi

正如我在对已接受答案的评论中所指出的那样,*有助于排除以“。”开头的文件和目录之类的内容。尽管您已经注意到,这意味着从源代码的顶层删除的文件和目录不会从目标目录中删除。就我自己而言,我不在乎顶级文件是否从目标位置正确删除,只有子目录下的文件才有意义。删除顶级子目录的可能性远小于添加子目录的可能性,在这种不太可能的情况下,我愿意在目标目录上进行手动rm -r操作。
sootsnoot
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.