Я пытаюсь использовать опцию --delete в rsync для удаления файлов в целевом каталоге, которых нет в исходном каталоге
Вот команда, которую я использую:
rsync -avz --ignore-existing --recursive --delete /var/www/* root@mydomaintest.com:/var/www
Итак, мой вопрос: как я могу удалить все файлы в целевом каталоге, которых нет в исходном каталоге?
Ваша команда не работала, потому что, когда вы использовали /var/www/* в качестве источника, ваша оболочка выполняет глобальную привязку к ней, т.е. оболочка расширяет * ко всем файлам в этом каталоге и копирует файлы один за другим, поэтому здесь отдельные файлы стали источниками, а не родительским каталогом.
Итак, если вы используете /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/
[d6 ] с *, создающим оболочку, чтобы развернуть ее и сделать все файлы по отдельности в качестве исходных аргументов, а не родительского каталога в целом (и в этом случае вам также не нужно --recursive). So , если вы хотите сделать работу --delete, запустите ее как:
rsync -avz --ignore-existing --recursive --delete
/var/www/ root@mydomaintest.com:/var/www/