Иногда у меня возникает проблема с тем, что rsync пытается передать новый файл из источника в место назначения (оба имеют одинаковое пространство), когда места уже недостаточно, что приводит к появлению этого сообщения об ошибке:

rsync: write failed on "{FILE}": No space left on device (28)

Тем не менее, остается место, если файлы, которых больше нет в исходном каталоге, будут удалены в месте назначения перед передачей любых файлов. Я использую --delete (по умолчанию --delete-before), но он только удаляет файл прямо перед передачей обновленной версии.

Итак, мне интересно, как я могу сначала удалить все устаревшие файлы (используя bash или rsync)?

1 ответ1

1

Флаг --delete для rsync приведет к удалению файлов в целевом каталоге, которые не отображаются в исходном каталоге. Поведение по умолчанию - удалять перед передачей файлов. (--Delete-раньше)

В режиме инкрементной рекурсии (режим по умолчанию, начиная с версии rsync 3.0), rsync обрабатывает каталоги пошагово, и "удаление до" происходит только для каждого каталога. Он удалит файлы, а затем скопирует новые файлы в каждом подкаталоге, который он найдет, когда встретится с ними.

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

--no-i-r

Обратите внимание, что это заставит его вернуться к прежнему поведению: собирать списки файлов из всего дерева каталогов по обеим сторонам передачи, делать все применимые удаления, а затем делать все копии. Это может занять больше времени, если у вас очень большая структура каталогов, но поведение будет правильным.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .