Об’єднайте папки та замініть файли за допомогою CLI


9

Я хочу оновити програмне забезпечення на форумі, і я хотів би перевірити процес оновлення, використовуючи CLI як можливість навчання.

Як злити вміст папки в іншу папку та замінити файли?

Відповіді:


10

Ви можете використовувати 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~

Щоб уточнити вищезазначений пункт: Як тільки це виглядає нормально, ви можете запустити цю команду, щоб видалити файли резервного копіювання:> $ find dest / -name "start dot ~" -delete Це, здається, не працює для мене, тоді як:> $ знайти dest / -name "start dot star ~" -delete зробив. Не впевнений, чи це помилка друку чи щось не налаштовано на мій кінець!

2

Ви можете використовувати cp -r name_of_the_folder / * name_of_the_destination_folder, де зірочка (*) стоїть для всіх файлів та -r для рекурсивної копії.

Ви також можете скористатися параметром -i, який запитає, чи хочете ви перезаписати вміст.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.