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

use*_*856 19 bash rsync 12.04

我正在尝试使用--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)

  • `--recursive` 过多,因为选项 `-a` 已经包含它 (3认同)
  • 那么是导致 --delete 命令不起作用的“*”吗? (2认同)
  • 这就是它的样子。:) (2认同)
  • 在某些情况下,“*”可能很重要,因为它排除了以“.”开头的文件/目录。例如,我在使用 rsync 将 git 下维护的目录从开发机器复制到生产机器时使用它。我不想同步 .git 存储库目录或 .gitignore 之类的文件,只是工作树,包括顶级文件和子目录。 (2认同)

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)

  • 出色的解释指出了真正的问题:使用“*”来扩展源列表。 (4认同)