Вам не потрібні довгі імена, якщо ви chdirпотрапляєте в каталог і просто використовуєте відносні шляхи до rmdir.
Або якщо у вас встановлена оболонка POSIX, або перенесіть її на еквівалент DOS:
# 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
(Використання змінної оболонки для відстеження, де ви перейменували її за умовами циклу, - це інша альтернатива розкрученню циклу, як я це зробив там.)
Це дозволяє уникнути накладних витрат центрального процесора на рішення KenD, що змушує ОС переходити по дереву від верхівки до першого nрівня щоразу, коли додається новий рівень, перевіряючи дозволи та ін. Отже, це має sum(1, n) = n * (n-1) / 2 = O(n^2)часову складність. Рішення, які вибивають шматок із початку ланцюга, повинні бути O(n), якщо Windows не потребує переходу дерева під час перейменування його батьківського каталогу. (Linux / Unix не робить.) Рішення, які chdirвесь шлях до низу дерева та використовують відносні шляхи звідти, видаляючи каталоги під час їх chdirрезервного копіювання, також повинні бути O(n), якщо припустити, що ОС не потрібно перевіряти всі ваші батьківські каталоги кожного системного дзвінка, коли ви робите речі, десь десь компакт-диски.
find Folder1 -depth -execdir rmdir {} +запустить rmdir під час компакт-диска у найглибший каталог. Або насправді, -deleteпараметр find працює в каталогах і має на увазі -depth. Так find Folder1 -deleteслід робити саме те саме, але швидше. Так, GNU знаходить у Linux пониження, скануючи каталог, CDing у підкаталоги з відносними шляхами, потім rmdirз відносним шляхом, потім chdir(".."). Він не переглядає каталоги під час зростання, тому споживає O(n)оперативну пам’ять.
Це було на самому ділі наближення: straceпоказує , що на насправді використовує unlinkat(AT_FDCWD, "tmp", AT_REMOVEDIR), open("..", O_DIRECTORY|...)і fchdir(the fd from opening the directory), з купою fstatвикликів , змішаних в теж. Але ефект такий же, якщо дерево каталогів не змінюється під час запуску знаходження.
редагувати: Просто для ударів, я спробував це на GNU / Linux (Ubuntu 14.10, на 2,4 ГГц Core2Duo процесора першого покоління, у файловій системі XFS на приводі Green Power WD 2,5 ТБ (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 створює каталог та будь-які відсутні компоненти компонента шляху).
Так, дійсно 0,05 секунди за 2 кп rmdir. xfs досить добре поєднує операції з метаданими разом у журналі, оскільки вони фіксували, що метадані можуть бути повільними, як 10 років тому.
На ext4, створення займало 0m0.279s, видалення з find все ще займало 0m0.074s.
/MIRнатомість:ROBOCOPY /MIR C:\temp\EmptyDirectory C:\Storage\Folder1також, можливо, варто запуститиchkdskсправедливий хихикання.