Làm cách nào để xóa các thư mục nguồn trống khi di chuyển các thư mục bằng rsync?


8

rsynccó thể được dỗ vào các thư mục di chuyển rất giống và vượt trội so với truyền thống mvvới các tùy chọn sau:

rsync -axvvES --remove-source-files source_directory /destination/

Tuy nhiên, có một điều tôi dường như chưa thể làm được là xóa các thư mục gốc. Các --remove-source-filescờ không chỉ vậy, loại bỏ các tập tin nguồn, nhưng không còn thư mục nguồn. Tôi ước có một --remove-source-directorieslá cờ là tốt, nhưng không có.

Làm thế nào tôi có thể đối phó với điều này? Tôi cho rằng tôi chỉ có thể ban hành rm -frsau khi di chuyển, tuy nhiên tôi muốn giữ tất cả quy trình trong một quy trình so với việc đưa ra khả năng xảy ra lỗi.


Lý do của bạn không sử dụng là mvgì?
Nils

1
Khối lượng khác nhau và tôi cần phải bảo tồn tất cả các thuộc tính, bao gồm cả thời gian.
ylluminate

1
Cùng một nhu cầu ở đây unix.stackexchange.com/q/78375/3858 .
Alix Axel

1
Tôi rất ngạc nhiên rsync không có tùy chọn cho việc này, đặc biệt là khi nó ở phía đích. Tôi kết thúc việc làmfind . -type d -empty | xargs rmdir -p
Sridhar Sarnobat

Bạn biết @ Sridhar-Sarnobat Tôi không thể không tự hỏi liệu có cách nào để chuyển kết quả từ một rsyncphiên vào danh sách được xử lý theo quy trình sau đó xóa sạch ... Hmm.
ylluminate

Câu trả lời:


4

Tôi đã không tìm thấy một lệnh thực hiện điều đó trong một lần, nhưng vì rsync vẫn hoạt động tốt hơn rm -rf(đặc biệt nếu bạn có số lượng thư mục rất lớn) nên đây là hai lệnh rsync thực hiện "di chuyển" :

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

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:incoming/ incoming/ && 
ssh server find incoming -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.


Lưu ý rằng rõ ràng bạn có thể cần phải thêm -depthvào OSX hoặc những người khác.
Charlie Gorichanaz

3

Tôi đã kết thúc trong một tình huống tương tự. Tôi muốn tránh rm -rf, biết rằng rsync không thể sao chép một số tệp và tôi không muốn mất chúng.

Để đơn giản xóa các thư mục trống, tôi tìm thấy thư mục này thuận tiện nhất (từ sourcedir):

find . -type d -empty -delete

Đúng, cảm ơn chúa vì sự cần thiết, điều mà tôi mới phát hiện ra gần đây và nó trở nên rất phổ biến đối với tôi để sử dụng.
Sridhar Sarnobat

2

Tại sao không chỉ thêm rm -rf source_directorysau rsync của bạn?

rsync -axvvES --remove-source-files source_directory /destination/ && rm -rf source_directory

Mỗi chương trình dòng lệnh được tạo ra để thực hiện một nhiệm vụ cụ thể và tùy thuộc vào bạn để kết hợp nhiều thứ lại với nhau để hoàn thành các nhiệm vụ phức tạp hơn.


2
Tôi nghĩ bạn đúng. Tôi tin rằng cuối cùng tôi cũng phải đi sâu xuống đáy vì tôi không thể bị bắt khi chỉ di chuyển theo cách rsync thông thường. Có lẽ cần phải sử dụng find -depth. Bạn có gợi ý nào về cách tiếp cận thuật toán nhanh để đi xuống dưới cùng của ngăn xếp dir không, với rsync, rm'ing như bạn lưu ý, và sau đó bước lên cây?
ylluminate
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.