我正在尝试使用--deletein 选项rsync删除目标目录中不存在于原始目录中的文件
这是我正在使用的命令:
rsync -avz --ignore-existing --recursive --delete /var/www/* root@mydomaintest.com:/var/www
Run Code Online (Sandbox Code Playgroud)
所以我的问题是,如何删除目标目录中原始目录中不存在的所有文件?
A.B*_*.B. 21
使用这个命令:
rsync --archive --verbose --compress --ignore-existing --delete /var/www/ root@mydomaintest.com:/var/www
Run Code Online (Sandbox Code Playgroud)
您不需要“*”,也不应该使用它。
要排除/包含文件或目录,您应该使用以下参数:
--exclude 'to_exclude*'
--include 'to_include*'
Run Code Online (Sandbox Code Playgroud)
hee*_*ayl 20
您的命令不起作用,因为当您/var/www/*作为源使用时,您的 shell 正在对其执行 globbing,即 shell 扩展*到该目录中的所有文件并逐个复制文件,因此这里的单个文件已成为源而不是父目录。
因此,如果您使用/var/www/*, 则您不需要--recursiveoption ,因为这*会导致文件被复制(以及包含其内容的任何目录),而不是包含文件的父目录。由于相同的原因--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
Run Code Online (Sandbox Code Playgroud)
如您所见,我使用了源代码,/foo/*因此rsync正在执行的命令是
rsync -avz --ignore-existing --recursive --delete /foo/egg
/foo/spam /foo/test /bar/
Run Code Online (Sandbox Code Playgroud)
使用*make shell 扩展它并将所有文件单独作为源参数,而不是整个父目录(--recursive在这种情况下你也不需要)。
所以,如果你想--delete工作,运行它:
rsync -avz --ignore-existing --recursive --delete
/var/www/ root@mydomaintest.com:/var/www/
Run Code Online (Sandbox Code Playgroud)