Gần đây tôi cần xóa một số lượng lớn tệp (hơn 1 triệu) và tôi đọc được điều đó:
rsync -av --delete `mktemp -d`/ ~/source && rmdir ~/source
Là một trong những cách tối ưu nhất để làm điều đó và tôi có thể khẳng định rằng nó nhanh hơn rm -rf
.
Tôi không phải là một chuyên gia về vấn đề này, nhưng theo hiểu biết của tôi, lý do cho hiệu suất rsync có gì đó để thực hiện theo cách liệt kê các tệp (LIFO thay vì FIFO tôi cho rằng). Bây giờ, vấn đề là, tôi cũng cần phải di chuyển một số lượng lớn các tệp một cách hiệu quả. Sau khi tìm kiếm một chút, tôi thấy điều này:
rsync -av --ignore-existing --remove-source-files ~/source ~/destination
Trong khi điều này xóa tất cả các tập tin di chuyển trong ~/source
, các thư mục vẫn ở đó. Vì tôi có cấu trúc thư mục giống như "vòng tròn", số lượng files/directories
rất gần với 1, vì vậy tôi buộc phải chạy lại lệnh đầu tiên để loại bỏ hoàn toàn thư mục:
rsync -av --ignore-existing --remove-source-files ~/source ~/destination && \
rsync -av --delete `mktemp -d`/ ~/source && rmdir ~/source
Một đường thẳng mv
sẽ hoàn thành gần như ngay lập tức, nhưng ~/destination
thư mục của tôi có các tệp nên được giữ, vì vậy mv
không phải là một tùy chọn. Tôi đã tìm thấy các tùy chọn --prune-empty-dirs
và --force
rsync, nhưng dường như không hoạt động như tôi mong đợi:
--force force deletion of directories even if not empty
--prune-empty-dirs prune empty directory chains from the file-list
--remove-source-files sender removes synchronized files (non-dirs)
Có cách nào để bắt chước một động thái với rsync trong một lần không?