Відповіді:
Ви можете використовувати rsync
для цього:
$ rsync -abviuzP src/ dest/
-a
режим архіву; дорівнює -rlptgoD (немає -H, -A, -X)-i
вмикає деталізований формат, де відображається більше інформації, ніж формат за замовчуванням-b
робить файли резервного копіювання rsync, які існують в обох папках, додаючи ~ до старого файлу. Ви можете керувати цим суфіксом за допомогою --suffix .suf-u
робить rsync передачі пропускних файлів, які новіші за призначенням, ніж у 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, який запитає, чи хочете ви перезаписати вміст.