rsync список файлов в подкаталогах на удаленный сервер и удаление посторонних

Я не смог найти ответ на этот вопрос. Я пробовал всевозможные комбинации --delete-excluded , --delete-excluded , -r , --delete-excluded и исходный каталог.

Это то, что я пытаюсь выполнить:

  • Исходный каталог:

     Dir1/File1-1 Dir1/File1-2 Dir2/File2-1 Dir2/File2-2 Dir2/File2-3 Dir3/File3-1 Dir3/File3-2 Dir3/File3-3 ... 
  • Целевой каталог:
    (состояние неизвестно)

То, что я хотел бы сделать, – предоставить предопределенное подмножество файлов из исходного каталога с относительным путем и rsync их в удаленный пункт назначения, удалив что-либо из адресата (включая каталоги), которого не было в подмножестве файлов ,

Например, с учетом приведенного выше справочника источника:

  • Мой предварительно определенный список файлов:

     Dir1/File1-2 Dir3/File3-3 
  • Целевой каталог:

     Dir1/File1-1 Dir1/File1-2 Dir2/File2-1 Dir3/File3-1 

Я бы ожидал иметь только Dir1 / File1-2, Dir3 / File3-3 и без Dir2 в пункте назначения, когда я закончил. Я также НЕ ожидал, что Dir1 / File1-2 будет скопирован снова.

Что нужно отметить:

  • Это очень большие файлы, и я стараюсь не допустить их повторной копии, если это не нужно.
  • Содержимое исходных подкаталогов меняется каждый день
  • Предварительно определенный список меняется каждый день, но может / будет включать файлы во вчерашний список
  • В исходном каталоге есть 0 файлов. Он содержит только подкаталоги, содержащие файлы, необходимые для синхронизации
  • Подкаталоги в источнике довольно статичны. то есть Dir1, Dir2 и Dir3 всегда будут там

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

Обновление :

Прежде всего, я хочу поблагодарить jw013 за изменения форматирования. Я следил за рекомендацией, но не понимал, почему это правильно не форматируется (плакат первого раза).

Используя предложения от Serge , я придумал следующую команду, но по-прежнему не удаляет посторонние файлы из адресата, которые НЕ находятся в списке файлов.

  • команда

     rsync -avRP --prune-empty-dirs --delete-delay --ignore-existing $FILE_LIST destination/ 

  • Сообщение rsync «пропускать нерегулярный файл», когда не копируются ссылки
  • Удалять файлы, существующие в источнике с помощью rsync
  • Linux зависает при передаче больших файлов с помощью rsync
  • беспроблемный доступ к rsync с ssh через cron
  • rsync зависает, если я не дефрагментирую файловую систему ext4
  • Ключевые кодовые фразы и SSH-кэшированная аутентификация?
  • Получение rsync для удаления исходных файлов, которые уже существуют в пункте назначения
  • Способы консолидации музыкальной папки
  • 3 Solutions collect form web for “rsync список файлов в подкаталогах на удаленный сервер и удаление посторонних”

    Вы можете сделать это, используя

     rsync -av --delete --update --include-from=LISTFILE -f 'hide,! */' src/ dst 

    где LISTFILE – это файл, содержащий все файлы, которые должны быть синхронизированы с целевым каталогом. Если ваши файлы не изменяются, вы можете использовать --ignore-existing вместо --update . Подробнее читайте на странице руководства rsync .

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

      --del an alias for --delete-during --delete delete extraneous files from dest dirs --delete-before receiver deletes before xfer, not during --delete-during receiver deletes during the transfer --delete-delay find deletions during, delete after --delete-after receiver deletes after transfer, not during 

    Кроме того, вы можете использовать --ignore-existing для пропуска копирования файлов, существующих в целевом --ignore-existing :

      --ignore-existing skip updating files that exist on receiver 

    И чтобы удалить пустые каталоги, вы должны использовать:

      -m, --prune-empty-dirs prune empty directory chains from file-list 

    Итак, команда

     rsync -av --prune-empty-dirs --delete-delay --ignore-existing src/ dst 

    будет делать то, что вы ищете, я полагаю

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

     rsync -a --delete-excluded --include-from=LISTFILE --exclude="*" src/ dst 

    Я не уверен, почему предлагаются некоторые другие варианты: P. Самый «интересный» – это --ignore-existing . Возможно, стоит убедиться, что вы сначала поняли более дружеские оптимизационные возможности – -a , или -u .

    Похоже, что вы уже используете -a , что подразумевает -t , что позволяет rsync оптимизировать по умолчанию. «Rsync находит файлы, которые необходимо перенести, используя алгоритм« быстрой проверки »(по умолчанию), который ищет файлы, которые изменились по размеру или в последнее время». Если вы не используете -a , часто можно использовать « -u или --update – пропускать файлы, которые являются более новыми на ресивере».

    Если вы хотите сравнить разницу с отключенной оптимизацией «быстрой проверки», вы можете использовать --checksum . (Это также полезно, если вы хотите принудительно повторно синхронизировать все существующие файлы в какой-то момент в случае повреждения. Включите -v и вы сможете увидеть, какие файлы нужно было переписать).

    Interesting Posts

    Текст grep / parse

    Как перенаправить трафик с моего общедоступного сервера на компьютер, который не является общедоступным?

    Почему mtime и ctime изменяются для каталога при изменении файла?

    Уникальные линии, основанные на первом поле

    Мне нужно получить номер строки, который имеет наибольшее значение

    Как отключить определенные комбинации нажатий клавиш

    Почему поле «Предоставляет» в локальном пакете Debian игнорируется (DepCompareOp)?

    как перенаправить вывод терминала в несколько файлов журнала

    Жесткий диск изменяет имя – Archlinux

    history – Список только успешно запускает команды

    Список 10 основных процессов процессора

    setfacl не работает в файлах, созданных Apache

    Как сетевые пакеты передаются в память на Linux?

    Какая встроенная платформа Linux поддерживает Suspend to RAM?

    Есть ли инструмент командной строки для вставки разрывов строк в длинную строку?

    Linux и Unix - лучшая ОС в мире.