Scal foldery i zamień pliki za pomocą CLI

9

Chcę zaktualizować niektóre oprogramowanie forum i chcę przetestować proces aktualizacji przy użyciu interfejsu CLI jako możliwości uczenia się.

Jak scalić zawartość folderu w inny folder i zastąpić pliki?

użytkownik46165
źródło

Odpowiedzi:

10

Możesz użyć rsyncdo tego:

$ rsync -abviuzP src/ dest/
  • -atryb archiwizacji; równa się -rlptgoD (bez -H, -A, -X)
  • -i włącza format wyszczególniony, który pokazuje więcej informacji niż format domyślny
  • -btworzy pliki kopii zapasowej rsync, które istnieją w obu folderach, dołączając ~ do starego pliku. Możesz kontrolować ten sufiks za pomocą --suffix .suf
  • -u powoduje, że rsync przesyła pliki pomijania, które są nowsze w dest niż w src
  • -z włącza kompresję, która jest przydatna podczas przesyłania łatwo kompresowalnych plików przez wolne łącza
  • -P włącza --partial i --progress
    • --partial sprawia, że ​​rsync zachowuje częściowo przesłane pliki, jeśli transfer zostanie przerwany
    • --progress pokazuje pasek postępu dla każdego transferu, przydatne w przypadku przesyłania dużych plików

Upuściłbym kilka z tych przełączników, ale to tylko na początek. Prawdopodobnie użyłbym czegoś takiego:

$ rsync -abuP src/ dest/

Gdy wszystko będzie w porządku, możesz uruchomić to polecenie, aby usunąć pliki kopii zapasowej:

$ find dest/ -name "*.~" -delete

Przykład

Udawajmy, że mamy następujące przykładowe dane.

oryginalne dane

Użyjemy następujących poleceń do wytworzenia fałszywych danych.

$ seq 10 | xargs -I{} -- mkdir dest/dir{}
$ for i in $(seq 5); do echo "$i" > dest/dir$i/file$i;done

Fałszywe dane wyglądają następująco:

$ 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

nowe dane

Teraz skopiujemy oryginalne dane ( dest/*-> src/) i dodamy kilka nowych plików do miksu. To symuluje „nową wersję.

$ cp -pr dest/* src/
$ mkdir src/dir11
$ for i in 1 3 5 11; do echo "$i$i" > src/dir$i/file$i;done

Fałszywe dane wyglądają następująco:

$ 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

Scal src / into dest /

Ten naśladuje, że właśnie nasza nowa konfiguracja oprogramowania w drzewo src/i chce wtopić się naszym pre-istniejącego katalogu 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

Jak widać, następujące pliki zostały zaktualizowane: plik1, plik3, plik5 i nowo dodany plik dir11 + plik11.

I jako potwierdzenie możemy zobaczyć, że następujące pliki kopii zapasowych zostały utworzone, rsyncgdy napotkał wcześniej istniejące pliki dest/.

$ find dest/ | grep "~"
dest/dir3/file3~
dest/dir1/file1~
dest/dir5/file5~
slm
źródło
Aby wyjaśnić powyższą kwestię: Gdy wszystko będzie w porządku, możesz uruchomić to polecenie, aby usunąć pliki kopii zapasowej:> $ find dest / -name "start dot ~" -delete Nie wydawało mi się to działać, podczas gdy:> $ znajdź dest / -name "start star star ~" -delete zrobione. Nie jestem pewien, czy to literówka, czy coś nie tak po mojej stronie!
2

Możesz użyć cp -r nazwa_folderu / * nazwa_folderu docelowego, gdzie gwiazdka (*) oznacza wszystkie pliki, a -r oznacza kopię rekurencyjną.

Możesz również użyć opcji -i, która zapyta, czy chcesz zastąpić zawartość.

Spyros Chiotakis
źródło