синхронизировать конкретный файл рекурсивно, но только в подкаталогах, присутствующих в пункте назначения

У меня есть два каталога dirOrig и dirDest на разных удаленных серверах. Оба они имеют множество подкаталогов на разных глубинах. Теперь мне нужно скопировать определенный файл или расширение – скажем, file1.txt рекурсивно из dirOrig в dirDest . Но мне нужно скопировать файл, только если этот подкаталог уже присутствует в dirDest .

Например, я могу систематически копировать только определенный файл из источника в пункт назначения, используя rsync, используя

 rsync -zarv --prune-empty-dirs --include "*/" --include="file1.txt" --exclude="*" "dirOrig" "dirDest" 

Но как ограничить эту копию только в подкаталогах, присутствующих в пункте назначения ( dirDest )

  • При использовании rsync необходимо передать конкретный файл перед другим
  • rsync приводит к почти всем поврежденным файлам
  • rsync без запроса пароля
  • Случайный код ошибки rsync 12 «Сброс соединения с помощью peer (104)» из задачи cron, которая запускается каждые 20 минут
  • Не копируются ли файлы при использовании rsync?
  • Содержимое Rsync tar с удаленным сервером
  • Однонаправленная синхронизация / репликация большого файла постепенно
  • RSync - Permission denied (13) при выполнении rsync в качестве корня
  • One Solution collect form web for “синхронизировать конкретный файл рекурсивно, но только в подкаталогах, присутствующих в пункте назначения”

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

    1. Используйте rsync для копирования dirOrig с dirOrig на server2

      rsync -zarv --prune-empty-dirs --include "*/" \ --include="file1.txt" --exclude="*" "server1:dirOrig" \ "server2:dirOrig"

    2. Удалите подкаталоги в скопированном dirOrig , которых нет в dirDest используя comm

      comm -23 <( cd server2:dirOrig && find -mindepth 1 -type d | sort ) \ <( cd server2:dirDest && find -mindepth 1 -type d | sort ) \ | ( cd server2:dirOrig && xargs rm -rf )

    3. Наконец rsync dirDest с dirOrig на основе контрольной суммы и удалите все файлы в dirOrig, отсутствующие в dirDest, за исключением file1.txt

      rsync -acv --exclude=file1.txt --delete \ server2:dirDest server2:dirOrig

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