Hợp nhất các thư mục và thay thế các tệp bằng CLI


9

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:


10

Bạn có thể sử dụng rsyncđể làm điều này:

$ rsync -abviuzP src/ dest/
  • -achế độ 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
  • -btạ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ớn

Tô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

Thí dụ

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 rsynckhi 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~

Để làm rõ vấn đề ở trên: Một 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 "start dot ~" -delete Điều này dường như không hoạt động với tôi, trong khi:> $ tìm Dest / -name "start dot star ~" -delete đã làm. Không chắc chắn nếu đó là một lỗi đánh máy hoặc một cái gì đó không được thiết lập đúng kết thúc của tôi!

2

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.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.