Gabungkan folder dan ganti file menggunakan CLI

9

Saya ingin memperbarui beberapa perangkat lunak forum dan saya ingin menguji proses peningkatan menggunakan CLI sebagai kemungkinan pembelajaran.

Bagaimana cara menggabungkan konten folder ke folder lain dan mengganti file?

pengguna46165
sumber

Jawaban:

10

Anda dapat menggunakannya rsyncuntuk melakukan ini:

$ rsync -abviuzP src/ dest/
  • -amode arsip; sama dengan -rlptgoD (no -H, -A, -X)
  • -i mengaktifkan format terperinci, yang menampilkan lebih banyak informasi daripada format standar
  • -bmembuat file cadangan rsync yang ada di kedua folder, menambahkan ~ ke file lama. Anda dapat mengontrol akhiran ini dengan --suffix .suf
  • -u membuat rsync mentransfer melewatkan file yang lebih baru di dest daripada di src
  • -z mengaktifkan kompresi, yang berguna saat mentransfer file yang mudah dikompresi melalui tautan lambat
  • -P mengaktifkan --partial dan --progress
    • --partial membuat rsync menyimpan sebagian file yang ditransfer jika transfer terputus
    • --progress menunjukkan bilah progres untuk setiap transfer, berguna jika Anda mentransfer file besar

Saya akan menjatuhkan beberapa switch ini tetapi ini hanya untuk membantu Anda memulai. Saya mungkin akan menggunakan sesuatu seperti ini:

$ rsync -abuP src/ dest/

Setelah terlihat OK, Anda dapat menjalankan perintah ini untuk menghapus file cadangan:

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

Contoh

Mari kita berpura-pura memiliki data sampel berikut.

data asli

Kami akan menggunakan perintah berikut untuk membuat beberapa data palsu.

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

Data palsu terlihat sebagai berikut:

$ 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

data baru

Sekarang kita akan mereplikasi data asli ( dest/*-> src/) dan menambahkan beberapa file baru ke dalam campuran. Ini mensimulasikan rilis baru.

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

Data palsu terlihat sebagai berikut:

$ 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

gabungkan src / ke dest /

Ini meniru yang baru saja kami susun pohon perangkat lunak baru kami src/dan ingin bergabung ke direktori kami yang sudah ada 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

Seperti yang Anda lihat, file-file berikut diperbarui, file1, file3, file5, dan dir11 + file11 yang baru ditambahkan.

Dan sebagai konfirmasi, kita dapat melihat bahwa file cadangan berikut dibuat rsyncsaat menemukan file yang sudah ada di dest/.

$ find dest/ | grep "~"
dest/dir3/file3~
dest/dir1/file1~
dest/dir5/file5~
slm
sumber
Untuk memperjelas poin di atas: Setelah terlihat OK, Anda dapat menjalankan perintah ini untuk menghapus file cadangan:> $ find dest / -name "start dot ~" -delete Ini sepertinya tidak berfungsi untuk saya, sedangkan:> $ temukan dest / -name "start dot star ~" -hapus lakukan. Tidak yakin apakah itu salah ketik atau sesuatu yang tidak diatur akhir saya!
2

Anda dapat menggunakan cp -r name_of_the_folder / * name_of_the_destination_folder di mana tanda bintang (*) adalah singkatan dari semua file dan -r untuk salinan rekursif.

Anda juga dapat menggunakan opsi -i yang akan menanyakan apakah Anda ingin menimpa konten.

Spyros Chiotakis
sumber