Non hai bisogno di nomi di percorso lunghi se entri chdir
nella directory e usi solo i percorsi relativi a rmdir
.
Oppure, se è installata una shell POSIX, o portarla sull'equivalente 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
(L'uso di una variabile shell per tracciare dove l'hai rinominata per la condizione del loop è l'altra alternativa allo svolgersi del loop come ho fatto lì.)
Questo evita il sovraccarico della CPU della soluzione di KenD, che forza il sistema operativo ad attraversare l'albero dall'alto verso il n
livello th ogni volta che viene aggiunto un nuovo livello, controllando le autorizzazioni ecc. Quindi ha una sum(1, n) = n * (n-1) / 2 = O(n^2)
complessità temporale. Le soluzioni che strappano un pezzo dall'inizio della catena dovrebbero essere O(n)
, a meno che Windows non debba attraversare un albero quando rinomina la sua directory padre. (Linux / Unix no.) Dovrebbero esserci anche soluzioni che chdir
arrivano fino in fondo all'albero e usano percorsi relativi da lì, rimuovendo le directory durante il chdir
backup O(n)
, supponendo che il sistema operativo non debba controllare tutti i le directory padre ogni chiamata di sistema, quando fai cose mentre sei registrato da qualche parte.
find Folder1 -depth -execdir rmdir {} +
eseguirà rmdir mentre viene registrato nella directory più profonda. O in realtà, l' -delete
opzione find funziona su directory e implica -depth
. Quindi find Folder1 -delete
dovrebbe fare esattamente la stessa cosa, ma più velocemente. Sì, GNU trova su Linux che discende scansionando una directory, passando da CD a sottodirectory con percorsi relativi, quindi rmdir
con un percorso relativo, quindi chdir("..")
. Non esegue nuovamente la scansione delle directory durante l'ascesa, quindi consumerebbe O(n)
RAM.
E 'stato davvero un'approssimazione: strace
spettacoli utilizza EFFETTIVAMENTE unlinkat(AT_FDCWD, "tmp", AT_REMOVEDIR)
, open("..", O_DIRECTORY|...)
e fchdir(the fd from opening the directory)
, con un gruppo di fstat
chiamate mescolati in, anche. Ma l'effetto è lo stesso se l'albero delle directory non viene modificato mentre find è in esecuzione.
modifica: Solo per i calci, l'ho provato su GNU / Linux (Ubuntu 14.10, su una CPU Core2Duo di prima generazione da 2,4 GHz, su un filesystem XFS su un'unità WD 2.5 TB Green Power (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 crea una directory e tutti i componenti del percorso mancanti).
Sì, davvero 0,05 secondi per operazioni 2k rmdir. xfs è abbastanza bravo a raggruppare insieme le operazioni di metadati nel diario, poiché hanno corretto le operazioni sui metadati essendo lente come 10 anni fa.
Su ext4, la creazione ha richiesto 0m0.279s, l'eliminazione con find ha richiesto ancora 0m0.074s.
/MIR
invece:ROBOCOPY /MIR C:\temp\EmptyDirectory C:\Storage\Folder1
potrebbe anche valere la pena correrechkdsk
solo per ridacchiare.