4

Это возможно с rsync?

Перенесите все из src:path/to/dir в dest:/path/to/other/dir и удалите некоторые из исходных файлов в src:path/to/dir которые соответствуют шаблону (или ограничению размера), но сохраняют все остальные файлы , Я не смог найти способ ограничения --remove-source-files с помощью регулярного выражения или ограничения размера.

Обновление 1 (уточнение): Я бы хотел, чтобы все файлы в src:path/to/dir были скопированы в dest:/path/to/other/dir . Как только это будет сделано, я хотел бы иметь некоторые файлы (те, которые соответствуют регулярному выражению или ограничению размера) в src:path/to/dir но не хочу удалять что-либо в dest:/path/to/other/dir .

Обновление 2 (уточнение): К сожалению, я не могу просто все синхронизировать, а затем вручную удалить файлы, соответствующие моему регулярному выражению, из src:. Файлы для удаления создаются непрерывно.

Допустим, есть N файлов того типа, который я хотел бы удалить после передачи в src: при запуске rsync. Ко времени завершения rsync таких файлов будет N+M. Если я сейчас удалю их вручную, я потеряю М-файлы, созданные во время работы rsync.

Поэтому я хотел бы иметь решение, гарантирующее, что единственные файлы, удаленные из src:, - это файлы, которые, как известно, успешно скопированы в dest:. Я мог бы получить список файлов из dest: после завершения rsync и сравнить этот список файлов с тем, что есть в src:, а затем выполнить удаление вручную. Но мне было интересно, может ли rsync сделать это самостоятельно.

2 ответа2

0

Скорее всего, "правильный" способ сделать то, что вы хотите, - это найти с помощью функции - это позволяет вам делать это "почти атомарно".

Я также рекомендую использовать mtime - это предотвращает создание файлов, в которые все еще выполняется запись, хотя, вероятно, есть и другие лучшие способы избежать этого.

Также см. Https://unix.stackexchange.com/questions/50692/executing-user-defined-function-in-a-find-exec-call для получения информации о связанных способах экспорта функций. Пример ниже специфичен для bash:

pattern='^match\.this\.pattern.*only$'

rsync_rm() {
 rsync path/to/dir/$1 dest:/path/to/other/dir/.
 echo $1 | egrep $pattern > /dev/null && rm $1
}

export -f rsync_rm

find path/to/dir -mtime +1 -exec bash -c 'rsync_rm "$@"' bash {} +
0

Вы хотите удалить до передачи или после? То есть должен Dest: иметь удаленные файлы?

Я подозреваю, что самый простой способ это сделать как отдельные команды. Используйте find | xargs rm чтобы удалить нужные файлы (возможно, добавив egrep в канал, если регулярное выражение сложное) и rsync чтобы сделать копию. Порядок исполнения будет определяться ответом на мой вопрос в первом абзаце.

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