Auf meiner Maschine läuft Debian Squeeze mit Apache, MySQL, PHP ... In einem der Verzeichnisse gibt es einige andere Verzeichnisse und viel zu viele Dateien, mehr als 500.000 Dateien. Ich habe versucht, sie über WinSCP zu löschen, aber es hängt sich auf. Selbst nach mehr als 24 Stunden reagiert WinSCP immer noch nicht. Im Moment versuche ich, dieses Verzeichnis mit Putty (rm -rf dirname) zu löschen, aber genau wie WinSCP reagiert es nicht mehr. Irgendwelche Vorschläge? Danke!
Ich habe Root-Zugriff auf die Maschine.
Antwort1
Das Löschen des Verzeichnisses sollte funktionieren. Sie könnten Probleme bekommen, wenn Sie versuchen, einzelne Dateien zu löschen, weil es so viele sind. Sie laufen doch nicht, rm -rf dirname/*
oder?
Ich vermute, dass Sie die SSH-Verbindung aufgrund von Inaktivität verlieren. Sind Sie sicher, dass der Befehl auf dem Server nicht korrekt ausgeführt wurde?
Eine mögliche Problemumgehung wäre in jedem Fall die Verwendung vonnein:
nohup rm -rf dirname
Sie können den Befehl starten und sich abmelden. Er wird im Hintergrund fortgesetzt.
AKTUALISIEREN:
ich fanddiese Fragebei U&L.SE, ich empfehle Ihnen, einen Blick darauf zu werfen. Leider kann ich Ihr Problem nicht reproduzieren. Ich habe ein Verzeichnis mit 2516007 Dateien erstellt und konnte es jederzeit löschen mit rm -rf
:
$ mkdir ha
$ for X in $(seq 1 10000);do touch {1..10000}_$X; done
$ ls -f ha | wc -l
2516007 <= I stopped before the for loop finished, but this should be enough
$ time rm -rf ha/
real 23m11.695s
user 0m3.540s
sys 0m42.891s
Das Löschen von ca. 2 Millionen leeren Dateien dauerte also 20 Minuten. Es erscheint plausibel, dass das Löschen einer großen Menge nicht leerer Dateien Stunden dauern kann.
Einige der Vorschläge aus der U&L-Frage sollten jedoch hilfreich sein. Insbesondere dieser:
find /delb -type f --delete
oder dieses hier (leicht abgeändert vom Original)
find /delb -type f -print0 | xargs -0r rm -f
Ein weiterer Trick besteht darin, immer nur ein paar Dateien gleichzeitig zu löschen. Wenn Sie wissen, dass einige Dateinamen mit der Zeichenfolge „foo“ beginnen, andere mit „bar“ usw., gehen Sie folgendermaßen vor:
rm -rf /delb/foo*
rm -rf /delb/bar*
und so weiter. Sie können auch Folgendes versuchen:
for n in {a..z}; do rm -rf /delb/$n*; done
for n in {A..Z}; do rm -rf /delb/$n*; done
for n in {0..9}; do rm -rf /delb/$n*; done
Dieser letzte Befehl löscht nacheinander alle Dateinamen, die mit jedem Buchstaben des Alphabets beginnen, und dann alle Dateinamen, die mit Zahlen beginnen.
Antwort2
Nebenbei bemerkt, nicht zu der bereits geposteten Antwort. Aus meiner Erfahrung im Umgang mit Dateisystemen, denen die Inodes ausgegangen sind. Mit über einer Milliarde Dateien auf dem Dateisystem.
Der schnellste Weg zum Löschen/Auflisten von Dateien ist die Verwendung von „find“, insbesondere wenn Sie Tausende von Dateien/Verzeichnissen haben. „Find“ beginnt sofort mit der Arbeit, sofern keine Erweiterung erforderlich ist.
find /zu/löschender/Pfad -type f --delete
Verwenden Sie *
als Teil Ihres Befehls keine andere Art von Befehlszeilenerweiterung. *
wird im Terminal ausgeführt, bevor es an den Befehl rm / ls usw. übergeben wird. Ihr Terminal versucht also, alle hunderttausend Dateien aufzulisten, bevor es sie an den eigentlichen Befehl übergibt, der die Arbeit erledigt. Das ist sehr langsam.
man bash
...
EXPANSION
Die Erweiterung wird in der Befehlszeile ausgeführt, nachdem sie in Wörter aufgeteilt wurde. Es gibt sieben Arten der Erweiterung: Klammernerweiterung, Tildeerweiterung, Parameter- und Variablenerweiterung, Befehlsersetzung, arithmetische Erweiterung, Wortaufteilung und Pfadnamenerweiterung.
...