我正在尝试使用该--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*
会导致复制文件(以及任何包含其内容的目录),而不是包含文件的父目录。由于相同的原因,--delete
as 不起作用,--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/