No necesita nombres de ruta largos si ingresa chdir
al directorio y solo usa rutas relativas a rmdir
.
O, si tiene un shell POSIX instalado, o lo transfiere al equivalente de 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
(El uso de una variable de shell para rastrear dónde lo renombró para la condición del bucle es la otra alternativa a desenrollar el bucle como lo hice allí).
Esto evita la sobrecarga de la CPU de la solución de KenD, lo que obliga al sistema operativo a atravesar el árbol desde el nivel superior hasta el n
nivel th cada vez que se agrega un nuevo nivel, verificando permisos, etc. Por lo tanto, tiene sum(1, n) = n * (n-1) / 2 = O(n^2)
complejidad de tiempo. Las soluciones que cortan un fragmento desde el inicio de la cadena deberían ser O(n)
, a menos que Windows necesite atravesar un árbol al cambiar el nombre de su directorio principal. (Linux / Unix no lo hace). Las soluciones que chdir
van chdir
hasta la parte inferior del árbol y usan rutas relativas desde allí, eliminando directorios a medida que se realizan copias de seguridad, también deberían serlo O(n)
, suponiendo que el sistema operativo no necesita verificar todos sus directorios principales cada llamada al sistema, cuando haces cosas mientras estás en CD en alguna parte.
find Folder1 -depth -execdir rmdir {} +
ejecutará rmdir mientras está en CD en el directorio más profundo. O, en realidad, la -delete
opción find funciona en directorios e implica -depth
. Entonces find Folder1 -delete
debería hacer exactamente lo mismo, pero más rápido. Sí, GNU encuentra en Linux desciende escaneando un directorio, CD a subdirectorios con rutas relativas, luego rmdir
con una ruta relativa, luego chdir("..")
. No vuelve a escanear directorios mientras asciende, por lo que consumiría O(n)
RAM.
Eso fue realmente una aproximación: strace
espectáculos que realmente utiliza unlinkat(AT_FDCWD, "tmp", AT_REMOVEDIR)
, open("..", O_DIRECTORY|...)
y fchdir(the fd from opening the directory)
, con un montón de fstat
llamadas mezclados, también. Pero el efecto es el mismo si el árbol de directorios no se modifica mientras se está ejecutando find.
editar: Solo por diversión, probé esto en GNU / Linux (Ubuntu 14.10, en una CPU Core2Duo de primera generación de 2.4GHz, en un sistema de archivos XFS en una unidad WD 2.5TB 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 un directorio y cualquier componente de ruta faltante).
Sí, realmente 0.05 segundos para 2k rmdir ops. xfs es bastante bueno para agrupar operaciones de metadatos en el diario, ya que repararon que las operaciones de metadatos eran lentas como hace 10 años.
En ext4, crear tomó 0m0.279s, eliminar con find todavía tomó 0m0.074s.
/MIR
lugar:ROBOCOPY /MIR C:\temp\EmptyDirectory C:\Storage\Folder1
también puede valer la pena correrchkdsk
solo por risas