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

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

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

这是我正在使用的命令:

rsync -avz --ignore-existing --recursive --delete /var/www/* [email protected]:/var/www

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

答案1

使用此命令:

rsync --archive --verbose --compress --ignore-existing --delete /var/www/ [email protected]:/var/www

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

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

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

答案2

您的命令不起作用,因为当您使用/var/www/*它作为源时,您的 shell 正在对其执行通配符,即 shell 正在扩展*到该目录中的所有文件并逐个复制文件,因此这里单个文件已成为源而不是父目录。

因此,如果您使用/var/www/*,则不需要--recursive选项 as*会导致复制文件(以及任何包含其内容的目录),而不是包含文件的父目录。由于相同的原因,--deleteas 不起作用,--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/

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

因此,如果您想--delete工作,请按如下方式运行:

rsync -avz --ignore-existing --recursive --delete 
/var/www/ [email protected]:/var/www/

相关内容