rsync не может удалить непустую директорию

10

При синхронизации удаленного резервного копирования я получаю сообщение об ошибке rsync cannot delete non-empty directory.

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

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

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

Это также означает, что если каталог больше не существует локально, его следует удалить, даже если он содержит исключенные файлы.

Можно ли настроить rsync для достижения этой цели?

marlar
источник

Ответы:

5

Используйте pмодификатор:

P указывает, что правило является скоропортящимся, что означает, что оно игнорируется в каталогах, которые удаляются. Например, правила по умолчанию опции -C, которые исключают такие вещи, как «CVS» и «* .o», помечены как скоропортящиеся, и не будут препятствовать удалению каталога, который был удален в источнике, в месте назначения.

Например, я использую -Fопцию, которая «говорит rsync искать файлы для каждого каталога .rsync-filter, которые были разбросаны по иерархии, и использовать их правила для фильтрации файлов при передаче».

Мой .rsync-filterсодержит строки, подобные этим, чтобы отфильтровать эти «пометы», которые Mac оставляют после себя:

-p .DS_Store
-p ._*

При использовании excludeвместо просто -добавьте запятую. Например :

exclude,p .DS_Store
exclude,p Thumbs.db
mivk
источник
0

Вы можете использовать модификаторы шаблона include / exclude, дополнения к шаблону, который вы использовали. Он сообщает rsync, что исключает правило только для стороны отправки.

-n: проверять только то, что будет удалено на desc, не удалять шаблон: * .sh desc: / home / kg / tmp

цель: хотите удалить конец файла .sh на деск, но если вы это сделаете, вы не сможете удалить на деск: rsync -rvz --exclude * .sh --delete -n conkg kg@192.168.31.202: / главная / кг / TMP

должен измениться на: добавьте -n при тестировании: rsync -rvz --exclude-from del.txt -n - удалить conkg kg@192.168.31.202: / home / kg / tmp real delete: rsync -rvz - exclude-from del.txt - удалить conkg kg@192.168.31.202: / home / kg / tmp cat del.txt -s * .sh

или: rsync -rvz --exclude -s * .sh - удалить conkg kg@192.168.31.202: / home / kg / tmp

кг деньг
источник
-2

просто используйте опции --max-size = xx и --delete в rsync. Он будет делать все автоматически и отвечать всем вашим требованиям.

Sparkie
источник
В лучшем случае это будет обходной путь. Я хочу полностью пропустить файлы mov, avi и cr2, потому что они обычно очень большие. Но те, которые я уже выложил на более быстрой линии некоторое время назад, должны быть сохранены. Теперь проблема в том, что самые большие файлы JPG больше, чем самые маленькие файлы CR2, поэтому это решение не идеальное. Я бы предпочел использовать функцию исключения для фильтрации имен файлов.
marlar