Опция Rsync --delete не удаляет файлы в целевой директории

Я пытаюсь использовать опцию --delete в rsync для удаления файлов в целевом каталоге, которого нет в исходном каталоге

Вот команда, которую я использую:

rsync -avz --ignore-existing --recursive --delete /var/www/* root@mydomaintest.com:/var/www

Итак, мой вопрос: как я могу удалить все файлы в целевом каталоге, которых нет в исходном каталоге?

14
задан 16 April 2015 в 15:34

2 ответа

Используйте эту команду:

rsync --archive --verbose --compress --ignore-existing --delete /var/www/ root@mydomaintest.com:/var/www

Вы не нуждаетесь "*" и не должны использовать его также.

Для исключения/включения файлов или каталогов необходимо использовать это параметры:

--exclude 'to_exclude*'
--include 'to_include*'
23
ответ дан 17 April 2015 в 01:34

Ваша команда не работала потому что, когда Вы использовали /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/
14
ответ дан 17 April 2015 в 01:34

Другие вопросы по тегам:

Похожие вопросы: