Rsync delete не работает

Как заставить rsync удалять файлы, которые были удалены из исходной папки?

Недавно я настроил компьютер с Ubuntu Server для размещения игровых серверов. Я установил плагин резервного копирования для каждого игрового сервера, который создает частые резервные копии файлов игрового мира в определенной папке на компьютере. Я также cron поставил задачу автоматически копировать эти резервные копии в папку Dropbox каждую ночь, используя rsync с этой -a опцией.

Через несколько месяцев моя учетная запись Dropbox достигла лимита хранилища, и я понял, что не смогу хранить столько резервных копий, поэтому я настроил плагин резервного копирования игрового сервера так, чтобы он не сохранял так много резервных копий, а затем несколько дней ждал, будет ли он удалите старые резервные копии, как это запланировано делать еженедельно. Плагин резервного копирования в конце концов выполнил свою работу и удалил старые резервные копии, поэтому я ожидал, что rsync задача cron впоследствии удалит более старые резервные копии из моей папки Dropbox, чтобы они соответствовали исходной папке, но этого не произошло. Итак, у меня есть пара вопросов:

По умолчанию добавляются ли в целевую папку rsync только те файлы, которые были добавлены в исходную папку, и изменяются файлы, которые были изменены в исходной папке, но НЕ удаляются файлы, которые были удалены из исходной папки?

Читайте также:  Battery boost nvidia как настроить

Если это так, каков наилучший способ сделать rsync это? Я хочу, чтобы папка назначения полностью отражала исходную папку, а это означает удаление любых файлов, которые были удалены из исходной папки.

Я вижу некоторые варианты, перечисленные на странице руководства, rsync которые могут помочь, но я не знаком с этим.

Источник

rsync не удалит файлы по назначению

Я пытаюсь зеркально отобразить каталог, который со временем меняет другой каталог. Моя проблема в том, что rsync не удаляет файлы по назначению, если они больше не существуют в исходной папке. Вот демонстрационный скрипт:

Как вы можете видеть, файл «a» все еще присутствует в целевом каталоге после повторного запуска rsync во второй раз, что мне не нужно. Я злоупотребляю опцией «-delete»?

3 ответа

Причина в том, что вы вызываете rsync on /tmp /1 /b, который вообще не будет рассматривать файл /tmp /1 /a.

Предполагается, что ваше намерение заключается в rsync каталоге /tmp /1 /- если вы используете «/tmp /1 /» в качестве источника, а не отдельных файлов, он заметит, что «a» был удален из и удалите его из целевого объекта.

Удалите * . Как упоминалось в man-страницах rsync, опция —delete не работает с подстановочными знаками.

Используйте это вместо:

» —Удалить Это говорит rsync удалять посторонние файлы со стороны приема (те, которые не находятся на стороне отправки), но только для синхронизируемых каталогов. Вы должны были попросить rsync отправить весь каталог (например, dir или dir/ ) без использования подстановочного знака для содержимого каталога (например, dir/* ), поскольку подстановочный знак расширяется на поэтому оболочка и rsync получают запрос на передачу отдельных файлов, а не в родительский каталог файлов. Файлы, которые исключены из передачи, также исключаются из удаления, если вы не используете параметр —delete-excluded или отмечаете правила как только сопоставление на отправляющей стороне (см. модификаторы include /exclude в разделе «ПРАВИЛА ФИЛЬТРА»). «

Если вы измените вторую строку rsync на rsync -a —delete $DIR1/ $DIR2 (без *), она будет работать. Причина в том, что оболочка расширяет код * к именам файлов в первом каталоге, который является только b в вашем случае, поэтому отсутствует файл a не будет вообще рассматриваться rsync, так как команда, которая выполняется, на самом деле rsync -a —delete $DIR1/b $DIR2 .

Источник

Как заставить rsync удалять файлы, которые были удалены из исходной папки?

Недавно я настроил компьютер с Ubuntu Server для размещения игровых серверов. Я установил плагин резервного копирования для каждого игрового сервера, который создает частые резервные копии файлов игрового мира в определенной папке на компьютере. Я также создал задачу cron для автоматического копирования этих резервных копий в папку Dropbox каждую ночь, используя rsync с опцией -a .

Через несколько месяцев моя учетная запись Dropbox достигла лимита хранилища, и я понял, что не смогу хранить столько резервных копий, поэтому я настроил плагин резервного копирования игрового сервера так, чтобы он не сохранял так много резервных копий, затем подождал несколько дней, чтобы увидеть если он будет удалять старые резервные копии, как это планируется делать еженедельно. Плагин резервного копирования в конце концов выполнил свою работу и удалил старые резервные копии, поэтому я ожидал, что задача cron rsync впоследствии удалит более старые резервные копии из моей папки Dropbox, чтобы они соответствовали исходной папке, но этого не произошло. Итак, у меня есть пара вопросов:

По умолчанию rsync только добавляет файлы в папку назначения, которые были добавлены в исходную папку и измените файлы, которые были изменены в исходной папке, но НЕ удалите файлы, которые были удалены из исходной папки ?

Если это так, каков наилучший способ заставить rsync сделать это? Я хочу, чтобы папка назначения полностью отражала исходную папку, а это означает удаление любых файлов, которые были удалены из исходной папки.

Я вижу некоторые варианты, перечисленные на странице руководства для rsync , которые могут помочь, но так как я не знаком с.

Источник

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

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

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

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

1 ответ

Ваша команда не работала, потому что, когда вы использовали /var/www/* в качестве источника, ваша оболочка выполняет глобальную привязку к ней, т.е. оболочка расширяет * ко всем файлам в этом каталоге и копирует файлы один за другим, поэтому здесь отдельные файлы стали источниками, а не родительским каталогом.

Итак, если вы используете /var/www/*, вам не нужна опция —recursive, так как * приведет к копированию файлов (вместе с любыми каталогами с их содержимым), а не родительским каталог, содержащий файлы. По той же причине —delete не работает, поскольку —delete удалит файлы из каталога назначения, которые не находятся в исходном каталоге, но вы копируете файлы, чтобы не удалять файлы (предположительно).

] Это сделает вас более ясным:

Как вы можете видеть, я использовал источник как /foo/*, поэтому выполняемая команда rsync:

[d6 ] с *, создающим оболочку, чтобы развернуть ее и сделать все файлы по отдельности в качестве исходных аргументов, а не родительского каталога в целом (и в этом случае вам также не нужно —recursive).

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

Источник

Rsync —delete option doesn’t delete files in target directory

I’m trying to use the —delete option in rsync to delete files in the target directory which isn’t present in the original directory

Here is the command I’m using:

So my question is, how can I delete all files in target directory which aren’t present in the original directory?

2 Answers 2

Use this command:

You do not need a «*» and should not use it too.

To exclude/include files or directories, you should use this parameters:

Your command was not working because when you were using /var/www/* as the source, your shell is performing globbing on it i.e. shell is expanding * to all files in that directory and the copying the files one by one, so here individual files have become the sources rather than the parent directory.

So, if you use /var/www/* , then you don’t need —recursive option as * will causes the files to be copied (along with any directories with their contents), not the parent directory that contains the files. Because of the same reason —delete is not working, as —delete will remove files from destination directory that are not in the source directory, but you are copying files so its not removing files (expectedly).

This will make you more clear:

As you can see, i have used the source as /foo/* hence the rsync command being executed is

with * making shell to expand it and make all files individually as source arguments, not the parent directory as a whole (and you also don’t need —recursive in this case).

So, if you want to make —delete work, run it as:

Источник

Оцените статью