Sie benötigen keine langen Pfadnamen, wenn Sie chdir
sich im Verzeichnis befinden und nur relative Pfade zu verwenden rmdir
.
Oder wenn Sie eine POSIX-Shell installiert haben oder diese auf das DOS-Äquivalent portieren:
# 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
(Die Verwendung einer Shell-Variablen zum Verfolgen, wo Sie sie für die Schleifenbedingung umbenannt haben, ist die andere Alternative zum Aufrollen der Schleife, wie ich es dort getan habe.)
Dies vermeidet den CPU-Overhead der KenD-Lösung, der das Betriebssystem dazu zwingt, den Baum n
jedes Mal von oben nach unten zu durchlaufen, wenn eine neue Ebene hinzugefügt wird, Berechtigungen überprüft usw. Das hat also sum(1, n) = n * (n-1) / 2 = O(n^2)
zeitliche Komplexität. Lösungen, die von Anfang an einen Teil der Kette abtrennen O(n)
, sollten es sein , es sei denn, Windows muss beim Umbenennen des übergeordneten Verzeichnisses einen Baum durchlaufen. (Linux / Unix nicht.) Lösungen, chdir
die sich bis zum Ende des Baums erstrecken und von dort aus relative Pfade verwenden und Verzeichnisse beim Sichern entfernen chdir
, sollten auch O(n)
funktionieren, vorausgesetzt, das Betriebssystem muss nicht alle Ihre Pfade überprüfen Übergeordnete Verzeichnisse bei jedem Systemaufruf, wenn Sie Dinge erledigen, während Sie sich auf einer CD befinden.
find Folder1 -depth -execdir rmdir {} +
wird rmdir ausführen, während die CD in das tiefste Verzeichnis verschoben wird. Oder tatsächlich -delete
funktioniert finds Option für Verzeichnisse und impliziert -depth
. Also find Folder1 -delete
sollte genau das Gleiche tun, aber schneller. Ja, GNU find unter Linux wird durch Durchsuchen eines Verzeichnisses ausgeführt und in Unterverzeichnisse mit relativen Pfaden und dann rmdir
mit relativen Pfaden kopiert chdir("..")
. Während des Aufstiegs werden keine Verzeichnisse erneut durchsucht, sodass O(n)
RAM verbraucht wird .
Das war wirklich eine Annäherung: strace
zeigt, dass es WIRKLICH verwendet unlinkat(AT_FDCWD, "tmp", AT_REMOVEDIR)
wird open("..", O_DIRECTORY|...)
, und fchdir(the fd from opening the directory)
mit ein paar fstat
Gesprächen auch. Der Effekt ist jedoch der gleiche, wenn der Verzeichnisbaum während der Ausführung von find nicht geändert wird.
Bearbeiten: Nur zum Spaß habe ich dies unter GNU / Linux versucht (Ubuntu 14.10, auf einer Core2Duo-CPU der ersten Generation mit 2,4 GHz, auf einem XFS-Dateisystem auf einem WD 2,5 TB Green Power-Laufwerk (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 erstellt ein Verzeichnis und alle fehlenden Pfadkomponenten).
Ja, wirklich 0,05 Sekunden für 2k rmdir ops. xfs ist ziemlich gut darin, Metadatenoperationen im Journal zusammenzufassen, da es feststellte, dass Metadatenoperationen wie vor 10 Jahren langsam waren.
Auf ext4 hat das Erstellen 0m0.279s gedauert, das Löschen mit find hat noch 0m0.074s gedauert.
/MIR
stattdessen versuchen :ROBOCOPY /MIR C:\temp\EmptyDirectory C:\Storage\Folder1
Vielleicht lohnt es sich auch,chkdsk
nur für ein Kichern zu laufen .