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


14

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

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

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

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

Ответы:


14

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

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

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

Чтобы исключить / включить файлы или каталоги, вы должны использовать следующие параметры:

--exclude 'to_exclude*'
--include 'to_include*'

Хорошо, позвольте мне попробовать это :)
user2028856

2
Так что, «*» вызывает команду --delete?
user2028856

2
Вот так это выглядит. :)
AB

3
--recursiveпереизбыток, потому что вариант -aуже включает его
Temak

1
«*» Может быть важно в некоторых случаях, поскольку исключает файлы / каталоги, начинающиеся с «.». Например, я использую его при использовании rsync для копирования каталога, поддерживаемого в git, с компьютера разработчика на рабочий компьютер. Я не хочу синхронизировать каталог репозитория .git или файлы, такие как .gitignore, только рабочее дерево, включая файлы верхнего уровня и подкаталоги.
Sootsnoot

14

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

с *созданием оболочки для его расширения и создания всех файлов по отдельности в качестве исходных аргументов, а не родительского каталога в целом (и --recursiveв этом случае вам также не нужен )

Итак, если вы хотите сделать --deleteработу, запустите ее как:

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

4
Отличное объяснение, указывающее на реальную проблему: используйте «*» для расширения списка источников.
Антонио Бардацци

Как отмечено в моем комментарии к принятому ответу, * может быть полезным для исключения таких вещей, как файлы и каталоги, начинающиеся с ".". Хотя, как вы заметили, это означает, что файлы и каталоги, удаленные с верхнего уровня в источнике, не будут удалены из каталога назначения. Что касается меня, мне все равно, будут ли файлы верхнего уровня должным образом удалены из места назначения, имеют значение только файлы ниже подкаталогов. Удаление подкаталога верхнего уровня гораздо менее вероятно, чем добавление одного, и я готов выполнить ручной rm -r в месте назначения в этом маловероятном случае.
Sootsnoot
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.