
У меня есть два каталога dirOrig
и dirDest
на разных удаленных серверах. Оба они имеют многочисленные подкаталоги на разной глубине. Теперь мне нужно скопировать определенный файл или расширение — скажем, file1.txt
рекурсивно из dirOrig
в dirDest
. Но мне нужно скопировать файл, только если подкаталог уже присутствует в dirDest
.
Например, я могу систематически копировать только определенный файл из источника в место назначения с помощью rsync, используя
rsync -zarv --prune-empty-dirs --include "*/" --include="file1.txt" --exclude="*" "dirOrig" "dirDest"
Но как ограничить это копирование только подкаталогами, присутствующими в месте назначения ( dirDest
)
решение1
Я не знаю ни одной команды, но хак, который я придумал, выглядит следующим образом.
Используйте
rsync
для копированияdirOrig
изserver1
вserver2
rsync -zarv --prune-empty-dirs --include "*/" \ --include="file1.txt" --exclude="*" "server1:dirOrig" \ "server2:dirOrig"
Удалите подкаталоги в скопированном виде
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 )
Наконец, выполните rsync на основе контрольной
dirDest
суммыdirOrig
и удалите все файлы в dirOrig, которых нет в dirDest, за исключениемfile1.txt
rsync -acv --exclude=file1.txt --delete \ server2:dirDest server2:dirOrig