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 не будет записывать на установленный общий ресурс NFS
  • Bash, чтобы получить результат передачи rsync и закрепить его как каталог в исходном каталоге
  • Использование setfacl для создания рекурсивных разрешений для Apache с помощью rsync
  • Как я могу дать пользователю возможность использования CAP_MKNOD?
  • Является ли настройка более высокого уровня для процесса эффективным способом снижения его влияния на загрузку системы / процессорное время?
  • Будет ли rsync использовать дельта-кодирование, даже когда я копирую между локальными жесткими дисками?
  • rsync репозиторий OpenIndiana на локальном сервере
  • Лучший способ архивирования после 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 и вы сможете увидеть, какие файлы нужно было переписать).

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