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?
Możesz użyć rsync
do tego:
$ rsync -abviuzP src/ dest/
-a
tryb 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-b
tworzy 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ówUpuś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
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, rsync
gdy napotkał wcześniej istniejące pliki dest/
.
$ find dest/ | grep "~"
dest/dir3/file3~
dest/dir1/file1~
dest/dir5/file5~
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ść.
źródło