Вам не потрібні довгі імена, якщо ви 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
справедливий хихикання.