Làm thế nào để rsync một thư mục đến một thư mục mới với tên khác nhau?


49

Tôi đang thực hiện chuyển dữ liệu, hệ thống tệp cũ phụ thuộc sâu vào một thư mục hiện nằm trên đường dẫn khác. Đây là một thư mục git lưu trữ mã trực tuyến. Tôi không có quyền để di chuyển nó hoặc đổi tên nó.

Vì vậy, những gì tôi có thể làm là rsync thư mục này vào cùng một đường dẫn cũ. Nhưng tên thư mục cũng thay đổi.

Có cách nào dễ dàng để tôi có thể rsync một thư mục đến một thư mục đích với một tên khác không?

Câu trả lời:


83

Nếu bạn muốn sử dụng rsyncđể đệ quy làm cho destthư mục trở thành bản sao chính xác của srcthư mục:

rsync -a src/ dest

Các rsynctrang người đàn ông giải thích cách làm việc này:

Dấu gạch chéo trên nguồn [...] tránh [s] tạo cấp độ thư mục bổ sung tại đích. Bạn có thể nghĩ về một dấu vết /trên một nguồn có nghĩa là "sao chép nội dung của thư mục này" thay vì "sao chép thư mục theo tên" [...]


3
Điều này sẽ tạo một srcthư mục trong destthư mục
Zen

7
@Zen, không phải trong bất kỳ phiên bản nào rsynctôi từng sử dụng. Nếu điều đó thực sự xảy ra với bạn, bạn đang thiếu dấu gạch chéo ở cuối đối số thư mục nguồn.
Adrian

3
Dấu gạch chéo lén lút đó là KHÓA ...
tutuca

Thật không may, điều này dường như không hoạt động nếu destlà một symlnk src, thay vào đó nó kết thúc việc sao chép srcvào src/src. Đã thử nghiệm trên macOS. Hy vọng rằng tôi có thể thay thế bar -> foo/bằng bar/, nhưng phải sử dụng một thư mục tạm thời trung gian.
dùng5359531

@ user5359531 Nếu bạn biết đó destlà một liên kết tượng trưng src, chỉ cần rm desttrước khi chạy lệnh trên. rsynclà đủ thông minh để tạo desttrước khi sao chép nội dung của src. Bạn không cần một thư mục tạm thời trung gian.
Adrian

1

Nếu cả hai hệ thống tập tin cũ và mới đều có thể truy cập được vào máy của bạn, thì hãy xem xét sử dụng liên kết tượng trưng thay vì rsync. Nếu lệnh rsync bạn đang sử dụng không chỉ định máy chủ (hoặc nếu chúng là cùng một máy chủ), thì đây là trường hợp. Bạn đang cố gắng phản chiếu hai thư mục có tên khác nhau trên cùng một máy chủ. Không sử dụng rsync cho việc này, vì bạn đang sao chép dữ liệu và bạn sẽ phải chạy rsync thường xuyên để giữ chúng đồng bộ.

Sử dụng một liên kết tượng trưng là một sửa chữa một lần sẽ phản chiếu hai thư mục (với các tên khác nhau) và hầu như không cần không gian. Nó giống như tạo một thư mục bí danh trỏ đến thư mục khác.

Giả sử bạn có git cũ trong thư mục có tên / old / path / old_git và bây giờ kho lưu trữ mã đã được chuyển sang / new / path / new_git

Bạn có thể làm:

cd /old/path
rm -rf old_git     (if you still have it there, get rid of it, or move it out of the way)  
ln -s /new/path/new_git old_git

Điều này sẽ tạo ra một liên kết như vậy:

/ cũ / đường dẫn / old_git -> / new / path / new_git

Vì vậy, bất cứ thứ gì được đưa vào new_git cũng sẽ có sẵn ngay lập tức theo cách cũ, mà không cần sao chép dữ liệu và không phải liên tục đồng bộ hóa chúng.


1
Hãy cẩn thận với lệnh rm -rf old_git. Điều này sẽ loại bỏ toàn bộ kho lưu trữ old_git của bạn. Nếu tôi không hiểu đúng vấn đề của bạn, đây có thể là một điều xấu.
jrel

0

Tôi tìm một giải pháp thay thế ngay bây giờ.

Sử dụng rysnc -r /origin/* /target/có thể đồng bộ tất cả các nội dung từ thư mục gốc đến thư mục đích.


8
Tôi tin rằng điều này không bao gồm các tệp dấu chấm (.foo) vì những tệp này sẽ không khớp với dấu hoa thị
Ray Burgemeestre

dựa trên sự mở rộng toàn cầu shell, về mặt kỹ thuật, nó sẽ vượt qua mọi tệp được tìm thấy ở đó như là một đối số cho rsync. nó gần như là giống như chạy rsync -r $(find /origin -maxdepth 1 -type f) /target/ . Như @RayBurgemeestre đã chỉ ra, việc mở rộng toàn cầu shell sẽ không bao gồm các tệp chấm.
Florian Castellane
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.