Tôi muốn cập nhật một số phần mềm diễn đàn và tôi muốn kiểm tra quá trình nâng cấp bằng CLI như một khả năng học tập.
Làm cách nào để hợp nhất nội dung của một thư mục vào một thư mục khác và thay thế các tệp?
Tôi muốn cập nhật một số phần mềm diễn đàn và tôi muốn kiểm tra quá trình nâng cấp bằng CLI như một khả năng học tập.
Làm cách nào để hợp nhất nội dung của một thư mục vào một thư mục khác và thay thế các tệp?
Câu trả lời:
Bạn có thể sử dụng rsync
để làm điều này:
$ rsync -abviuzP src/ dest/
-a
chế độ lưu trữ; bằng -rlptgoD (không -H, -A, -X)-i
bật định dạng được ghi thành từng mục, hiển thị nhiều thông tin hơn định dạng mặc định-b
tạo các tệp sao lưu rsync tồn tại trong cả hai thư mục, nối thêm ~ vào tệp cũ. Bạn có thể kiểm soát hậu tố này bằng --suffix .suf-u
làm cho rsync chuyển bỏ qua các tệp mới hơn trong mệnh lệnh so với trong src-z
bật tính năng nén, rất hữu ích khi truyền các tệp dễ nén qua các liên kết chậm-P
bật - một phần và -
--partial
làm cho rsync giữ các tệp được chuyển một phần nếu quá trình truyền bị gián đoạn--progress
hiển thị thanh tiến trình cho mỗi lần chuyển, hữu ích nếu bạn chuyển các tệp lớnTôi sẽ bỏ một vài trong số các công tắc này nhưng điều này chỉ để giúp bạn bắt đầu. Tôi có thể sử dụng một cái gì đó như thế này:
$ rsync -abuP src/ dest/
Khi nó ổn, bạn có thể chạy lệnh này để xóa các tệp sao lưu:
$ find dest/ -name "*.~" -delete
Hãy giả vờ rằng chúng ta có dữ liệu mẫu sau.
dữ liệu gốc
Chúng tôi sẽ sử dụng các lệnh sau để sản xuất một số dữ liệu giả mạo.
$ seq 10 | xargs -I{} -- mkdir dest/dir{}
$ for i in $(seq 5); do echo "$i" > dest/dir$i/file$i;done
Dữ liệu giả mạo như sau:
$ 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
dữ liệu mới
Bây giờ chúng tôi sẽ sao chép dữ liệu gốc ( dest/*
-> src/
) và thêm một vài tệp mới hơn vào hỗn hợp. Điều này mô phỏng một "bản phát hành mới.
$ cp -pr dest/* src/
$ mkdir src/dir11
$ for i in 1 3 5 11; do echo "$i$i" > src/dir$i/file$i;done
Dữ liệu giả mạo như sau:
$ 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
hợp nhất src / vào mệnh /
Điều này bắt chước mà chúng ta vừa thiết lập cây phần mềm mới của mình src/
và muốn hợp nhất vào thư mục tồn tại trước đó , 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
Như bạn có thể thấy các tệp sau đây đã được cập nhật, file1, file3, file5 và dir11 + file11 mới được thêm vào.
Và như xác nhận, chúng ta có thể thấy rằng các tệp sao lưu sau được tạo bởi rsync
khi nó gặp các tệp tồn tại trước đó dest/
.
$ find dest/ | grep "~"
dest/dir3/file3~
dest/dir1/file1~
dest/dir5/file5~
Bạn có thể sử dụng cp -r name_of_the_folder / * name_of_the_destination_folder trong đó dấu hoa thị (*) là viết tắt của tất cả các tệp và -r cho bản sao đệ quy.
Bạn cũng có thể sử dụng tùy chọn -i sẽ hỏi bạn nếu bạn muốn ghi đè lên nội dung.