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

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

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

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

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

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

решение1

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

  1. Используйте rsyncдля копирования dirOrigиз server1в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

Связанный контент