Объединяйте папки и заменяйте файлы с помощью CLI

9

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

Как объединить содержимое одной папки в другую и заменить файлы?

user46165
источник

Ответы:

10

Вы можете использовать rsyncдля этого:

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

Спирос Чиотакис
источник