Liệt kê các thư mục lồng nhau sâu trước.
find . -depth -type d -exec rmdir {} \; 2>/dev/null
(Lưu ý rằng chuyển hướng áp dụng cho find
toàn bộ lệnh, không chỉ cho rmdir
. Chuyển hướng chỉ để rmdir
gây ra sự chậm lại đáng kể vì bạn cần phải gọi một lớp vỏ trung gian.)
Bạn có thể tránh chạy rmdir
trên các thư mục không trống bằng cách chuyển -empty
vị ngữ cần tìm. GNU find kiểm tra thư mục khi nó sắp chạy lệnh, vì vậy các thư mục vừa bị xóa sẽ được chọn.
find . -depth -type d -empty -exec rmdir {} \;
Một cách khác để tăng tốc sẽ là nhóm các rmdir
yêu cầu. Cả hai đều có khả năng nhanh hơn đáng kể so với bản gốc, đặc biệt là dưới Cygwin. Tôi không mong đợi nhiều sự khác biệt giữa hai điều này.
find . -depth -type d -print0 | xargs -0 rmdir 2>/dev/null
find . -depth -type d -exec rmdir {} + 2>/dev/null
Phương pháp nào nhanh hơn phụ thuộc vào số lượng thư mục không trống của bạn. Bạn không thể kết hợp -empty
với các phương pháp để nhóm các yêu cầu, bởi vì sau đó các thư mục chỉ chứa các thư mục trống sẽ không trống theo thời gian find
nhìn vào chúng.
Một phương pháp khác là chạy nhiều lượt. Việc này có nhanh hơn hay không phụ thuộc vào rất nhiều thứ, bao gồm cả việc phân cấp toàn bộ thư mục có thể duy trì trong bộ đệm của đĩa giữa các find
lần chạy hay không.
while [ -n "$(find . -depth -type d -empty -print -exec rmdir {} +)" ]; do :; done
Ngoài ra, sử dụng zsh. Vòng loại toàn cầu F
khớp với các thư mục không trống, do đó /^F
khớp với các thư mục trống. Các thư mục chỉ chứa các thư mục trống không thể được so khớp dễ dàng.
while rmdir **/*(/N^F); do :; done
(Điều này chấm dứt khi rmdir
nhận được một dòng lệnh trống.)