Параметр Rsync --delete не удаляет файлы в целевом каталоге

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

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

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

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

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

1 ответ

Ваша команда не работала, потому что, когда вы использовали /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/
12
ответ дан 23 May 2018 в 21:21
  • 1
    Отличное объяснение, указывающее на реальную проблему: использование '*' для расширения списка источников. – Antonio Bardazzi 8 July 2016 в 17:47
  • 2
    Как отмечено в моем комментарии к принятому ответу, * может быть полезно исключить такие вещи, как файлы и каталоги, начинающиеся с & quot ;. & quot ;. Хотя, как вы заметили, это означает, что файлы и каталоги, удаленные с верхнего уровня в источнике, не будут удалены из целевого каталога. Для меня, мне все равно, что файлы верхнего уровня будут удалены должным образом из места назначения, важны только файлы под подкаталогами. Удаление поддиректории верхнего уровня гораздо менее вероятно, чем добавление одного, и я готов сделать ручную rm -r в пункте назначения в этом маловероятном случае. – sootsnoot 14 September 2016 в 07:12

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

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