RSYNC không xóa các thư mục nguồn


27

Tôi đang sử dụng rsync để tìm nạp các tệp cần thiết khỏi máy chủ, sau đó xóa các tệp khỏi máy chủ khi tôi có chúng cục bộ. Lệnh đầy đủ tôi đang chạy ở bên dưới.

Điều này sẽ xóa thành công các tệp trên máy chủ nguồn, tuy nhiên các thư mục trống vẫn còn. Tôi không nhận được bất kỳ tin nhắn hoặc lỗi. Tất cả đầu ra là bình thường. Có lẽ đây là chức năng dự định.

Làm cách nào tôi có thể yêu cầu rsync dọn dẹp mọi thứ, kể cả các thư mục?

rsync --progress -vrzh --remove-source-files

Phiên bản là 3.0.9 ở cả hai đầu.


Câu trả lời:


13

Hành vi --remove-source-filesmà bạn quan sát là chính xác được chỉ định bởi man rsync:

--remove-source-files

   This tells rsync to remove from the sending side the files (meaning non-directories) that are a part of the transfer and have been successfully duplicated on the receiving side.

Không có lệnh cụ thể để loại bỏ các thư mục, vì hai cuộc thảo luận này trong StackExchangeServerFault hiển thị rõ ràng. Giải pháp đề xuất là có hai lệnh riêng biệt:

 rsync -av --ignore-existing --remove-source-files source/ destination/ && \
 rsync -av --delete `mktemp -d`/ source/ 

Phần cuối cùng của lệnh được đề xuất trong hai bài viết này,

 rmdir source/

cần thiết để loại bỏ thư mục nguồn (hiện đã bị xóa) có dạng này trong các bài đăng này vì các OP và câu trả lời đang sử dụng rsync để di chuyển một lượng lớn tệp trong cùng một máy. Trong trường hợp của bạn, bạn sẽ phải làm điều này bằng tay.


5
Các rsync --deletegợi ý là nguy hiểm, vì nó bỏ qua khả năng rằng rsync không được hoàn thành, hoặc có những tập tin mới tại nguồn. findPhương pháp @ slhck dưới đây an toàn hơn nhiều.
Sai

29

Trang này thậm chí còn nói:

--remove-source-files   sender removes synchronized files (non-dirs)

Nếu bạn muốn xóa các thư mục trống trong nguồn của mình, nếu vẫn còn các tệp, hãy thực hiện:

find . -depth -type d -empty -delete

Nhưng đối với một thư mục gốc trống, rm -rf <directory>tất nhiên sẽ đủ.


5
Vâng, đây là giải pháp duy nhất. đó là một tính năng thiếu sót ngớ ngẩn của rsync ... rsync biết khi nào nó xử lý tệp cuối cùng trong một thư mục ... thật dễ dàng để xóa thư mục nếu nó trống.
Erik Aronesty

4
Coi chừng việc phát hành "rm -rf" là dễ xảy ra tình trạng chủng tộc và tôi không khuyến khích điều đó.
Raúl Salinas-Monteagudo

Biến thể không xóa thư mục trống cấp cao nhất:find some_dir -depth -type d -empty -not -path some_dir -delete
Cameron Tacklind

5

Sử dụng " rm -rf " có một điều kiện chủng tộc vốn có, bạn có thể xóa các tệp vừa được tạo giữa rsync và các lệnh rm .

Tôi thích sử dụng:

rsync --remove-source-files -a server: đến / đến / &&

máy chủ ssh tìm đến -type d -delete

Điều này sẽ KHÔNG loại bỏ các thư mục nếu chúng không trống.


2
Cũng rm -rfsẽ loại bỏ các tập tin không được chuyển vì một số lý do.
Kristian

1
Câu trả lời này bỏ lỡ -depthtùy chọn hướng dẫn findxử lý theo đúng thứ tự. Do lỗi này, các thư mục chỉ chứa các thư mục trống (có thể đệ quy) sẽ không bị xóa. Các biến thể của @slhck có nó đúng.
Stéphane Gourmetichon

1

-m, --prune-empty-dirs tỉa chuỗi thư mục trống từ danh sách tập tin

--force buộc xóa các thư mục ngay cả khi không trống


1
Điều đó chỉ ngăn rsync sao chép các thư mục trống. Nó không xóa các thư mục trống.
Navin

1

Xóa các tập tin nguồn, sau đó loại bỏ các thư mục để được an toàn.

# given this scenario where you generate folders 2014-01-01 etc.. that have an archive myfile.tar.gz
pushd $(mktemp -d)
mkdir 201{4..6}-{01..12}-{01..31}
for i in $(ls); do; touch $i/myfile.tar.gz;done;
# find and rsync on 10 CPU threads directories that match ./2015-*
find /tmp/tmp.yjDyF1jN70/src -type d -name '2015-*' | \
parallel \
--jobs 10 \
--progress \
--eta \
--round-robin \
rsync \
--hard-links \
--archive --verbose --protect-args \
--remove-source-files \
{} /tmp/tmp.yjDyF1jN70/dest
# now safely remove empty directories only
for i in $(ls /tmp/tmp.yjDyF1jN70/src); do; rmdir /tmp/tmp.yjDyF1jN70/src/$i; done;

Thông tin thêm về GNU Song song

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.