Bạn không cần tên đường dẫn dài nếu bạn chdir
vào thư mục và chỉ sử dụng các đường dẫn tương đối rmdir
.
Hoặc, nếu bạn đã cài đặt vỏ POSIX hoặc chuyển cổng này sang DOS tương đương:
# untested code, didn't bother actually testing since the OP already solved the problem.
while [ -d Folder1 ]; do
mv Folder1/Folder1/Folder1/Folder1 tmp # repeat more times to work in larger batches
rm -r Folder1 # remove the first several levels remaining after moving the main tree out
# then repeat to end up with the remaining big tree under the original name
mv tmp/Folder1/Folder1/.../Folder1 Folder1
rm -r tmp
done
(Sử dụng biến shell để theo dõi nơi bạn đổi tên nó cho điều kiện vòng lặp là cách khác để hủy bỏ vòng lặp như tôi đã làm ở đó.)
Điều này tránh được chi phí CPU của giải pháp KenD, điều này buộc HĐH phải vượt qua cây từ cấp cao nhất đến n
cấp độ mỗi khi thêm cấp độ mới, kiểm tra quyền, v.v. Vì vậy, nó có sum(1, n) = n * (n-1) / 2 = O(n^2)
độ phức tạp về thời gian. Các giải pháp cắt bỏ một đoạn từ đầu chuỗi nên được O(n)
, trừ khi Windows cần duyệt qua cây khi đổi tên thư mục mẹ của nó. (Linux / Unix không.) Các giải pháp chdir
đi xuống tận cùng của cây và sử dụng các đường dẫn tương đối từ đó, xóa các thư mục khi chúng chdir
sao lưu, cũng nên O(n)
, giả sử HĐH không cần kiểm tra tất cả thư mục cha mẹ mỗi cuộc gọi hệ thống, khi bạn làm mọi thứ trong khi CD ở đâu đó.
find Folder1 -depth -execdir rmdir {} +
sẽ chạy rmdir trong khi CD vào thư mục sâu nhất. Hoặc thực tế, -delete
tùy chọn find hoạt động trên các thư mục và ngụ ý -depth
. Vì vậy, find Folder1 -delete
nên làm điều tương tự chính xác, nhưng nhanh hơn. Vâng, GNU tìm thấy trên Linux xuống bằng cách quét một thư mục, ghi vào thư mục con với các đường dẫn tương đối, sau đó rmdir
với một đường dẫn tương đối, sau đó chdir("..")
. Nó không quét lại các thư mục trong khi tăng dần, vì vậy nó sẽ tiêu thụ O(n)
RAM.
Đó là thực sự là một xấp xỉ: strace
chương trình nó thực sự sử dụng unlinkat(AT_FDCWD, "tmp", AT_REMOVEDIR)
, open("..", O_DIRECTORY|...)
và fchdir(the fd from opening the directory)
, với một loạt các fstat
cuộc gọi trộn lẫn trong, quá. Nhưng hiệu ứng là như nhau nếu cây thư mục không được sửa đổi trong khi find đang chạy.
chỉnh sửa: Chỉ để thực hiện, tôi đã thử điều này trên GNU / Linux (Ubuntu 14.10, trên CPU Core2Duo thế hệ đầu tiên 2,4 GHz, trên hệ thống tệp XFS trên ổ đĩa Green Power WD WD (WD25EZRS)).
time mkdir -p $(perl -e 'print "annoyingfoldername/" x 2000, "\n"')
real 0m1.141s
user 0m0.005s
sys 0m0.052s
find annoyingfoldername/ | wc
2000 2000 38019001 # 2k lines / 2k words / 38M characters of text
ll -R annoyingfoldername
... eventually
ls: cannot access ./annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername: File name too long
total 0
?????????? ? ? ? ? ? annoyingfoldername
time find annoyingfoldername -delete
real 0m0.054s
user 0m0.004s
sys 0m0.049s
# about the same for normal rm -r,
# which also didn't fail due to long path names
(mkdir -p tạo một thư mục và bất kỳ thành phần đường dẫn bị thiếu nào).
Vâng, thực sự 0,05 giây cho 2k rmdir ops. xfs khá giỏi trong việc kết hợp các hoạt động siêu dữ liệu với nhau trên tạp chí, vì chúng đã sửa lỗi các dữ liệu meta bị chậm như 10 năm trước.
Trên ext4, tạo mất 0m0.279s, xóa với find vẫn mất 0m0.074s.
/MIR
Thay vào đó tôi sẽ thử :ROBOCOPY /MIR C:\temp\EmptyDirectory C:\Storage\Folder1
cũng có thể đáng để chạychkdsk
chỉ để cười khúc khích.