Я пытаюсь использовать опцию --delete
в rsync
для удаления файлов в целевом каталоге, которого нет в исходном каталоге
Вот команда, которую я использую:
rsync -avz --ignore-existing --recursive --delete /var/www/* root@mydomaintest.com:/var/www
Итак, мой вопрос: как я могу удалить все файлы в целевом каталоге, которых нет в исходном каталоге?
Используйте эту команду:
rsync --archive --verbose --compress --ignore-existing --delete /var/www/ root@mydomaintest.com:/var/www
Вы не нуждаетесь "*" и не должны использовать его также.
Для исключения/включения файлов или каталогов необходимо использовать это параметры:
--exclude 'to_exclude*'
--include 'to_include*'
Ваша команда не работала потому что, когда Вы использовали /var/www/*
как источник, Ваша оболочка выполняет globbing на нем, т.е. оболочка расширяется *
во все файлы в том каталоге и копировании файлов один за другим, таким образом, здесь отдельные файлы стали источниками, а не родительским каталогом.
Так, если Вы используете /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/
с *
создание оболочки, чтобы развернуть его и сделать все файлы индивидуально как исходные аргументы, не родительский каталог в целом (и Вам также не нужно --recursive
в этом случае).
Так, если Вы хотите сделать --delete
работа, выполненная это как:
rsync -avz --ignore-existing --recursive --delete
/var/www/ root@mydomaintest.com:/var/www/