Можно использовать rsync
сделать это:
$ rsync -abviuzP src/ dest/
-a
режим архивирования; равняется-rlptgoD (никакой-H,-A,-X)-i
включает перечисленный формат, который показывает больше информации, чем формат по умолчанию-b
делает rsync файлы резервных копий, которые существуют в обеих папках, добавляя ~ в старый файл. Можно управлять этим суффиксом с - снабжают суффиксом .suf-u
делает файлы пропуска передачи rsync, которые являются более новыми в dest, чем в src-z
включает сжатие, которое полезно при передаче легко сжимаемых файлов по медленным каналам-P
включает - неравнодушный и - прогресс --partial
заставляет rsync сохранить частично переданные файлы, если передача прервана--progress
показывает индикатор выполнения для каждой передачи, полезной, если Вы передаете большие файлыЯ отбросил бы несколько из этих переключателей, но это должно было только запустить Вас. Я, вероятно, использовал бы что-то вроде этого:
$ rsync -abuP src/ dest/
После того как это смотрит хорошо, можно выполнить эту команду для удаления файлов резервных копий:
$ find dest/ -name "*.~" -delete
Давайте притворимся, что у нас есть следующие демонстрационные данные.
исходные данные
Мы будем использовать следующие команды для производства некоторых поддельных данных.
$ seq 10 | xargs -I{} -- mkdir dest/dir{}
$ for i in $(seq 5); do echo "$i" > dest/dir$i/file$i;done
Поддельные данные смотрят следующим образом:
$ tree -DsifvF --noreport dest/
dest
[ 4096 Aug 29 22:21] dest/dir1/
[ 2 Aug 29 22:21] dest/dir1/file1
[ 4096 Aug 29 22:21] dest/dir2/
[ 2 Aug 29 22:21] dest/dir2/file2
[ 4096 Aug 29 22:21] dest/dir3/
[ 2 Aug 29 22:21] dest/dir3/file3
[ 4096 Aug 29 22:21] dest/dir4/
[ 2 Aug 29 22:21] dest/dir4/file4
[ 4096 Aug 29 22:21] dest/dir5/
[ 2 Aug 29 22:21] dest/dir5/file5
новые данные
Теперь мы будем копировать исходные данные (dest/*
-> src/
) и добавление нескольких более новых файлов к соединению. Это моделирует "новый выпуск.
$ cp -pr dest/* src/
$ mkdir src/dir11
$ for i in 1 3 5 11; do echo "$i$i" > src/dir$i/file$i;done
Поддельные данные смотрят следующим образом:
$ tree -DsifvF --noreport src/
src
[ 4096 Aug 29 22:21] src/dir1/
[ 3 Aug 29 23:00] src/dir1/file1
[ 4096 Aug 29 22:21] src/dir2/
[ 2 Aug 29 22:21] src/dir2/file2
[ 4096 Aug 29 22:21] src/dir3/
[ 3 Aug 29 23:00] src/dir3/file3
[ 4096 Aug 29 22:21] src/dir4/
[ 2 Aug 29 22:21] src/dir4/file4
[ 4096 Aug 29 22:21] src/dir5/
[ 3 Aug 29 23:00] src/dir5/file5
[ 4096 Aug 29 23:00] src/dir11/
[ 5 Aug 29 23:00] src/dir11/file11
объедините src/в dest/
Это подражает этому, мы просто устанавливаем наше новое дерево программного обеспечения в src/
и хочу объединиться в наш существующий ранее каталог, dest/
.
$ rsync -abuP src/ dest/
sending incremental file list
dir1/file1
3 100% 0.00kB/s 0:00:00 (xfer#1, to-check=5/13)
dir11/
dir11/file11
5 100% 4.88kB/s 0:00:00 (xfer#2, to-check=4/13)
dir3/file3
3 100% 2.93kB/s 0:00:00 (xfer#3, to-check=2/13)
dir5/file5
3 100% 2.93kB/s 0:00:00 (xfer#4, to-check=0/13)
sent 416 bytes received 97 bytes 1026.00 bytes/sec
total size is 18 speedup is 0.04
Поскольку Вы видите, что следующие файлы были обновлены, file1, file3, file5, и недавно добавленный dir11 + file11.
И как подтверждение мы видим, что следующие файлы резервных копий были созданы rsync
когда это встретилось с существующими ранее файлами в dest/
.
$ find dest/ | grep "~"
dest/dir3/file3~
dest/dir1/file1~
dest/dir5/file5~
Можно использовать CP-r name_of_the_folder /* name_of_the_destination_folder, где звездочка (*) обозначает все файлы и-r для рекурсивной копии.
Можно использовать также-i опцию, которая спросит Вас, если Вы захотите перезаписать содержание.