Zu viele Dateien zum Löschen
Hallo, ich hatte vor kurzem ein merkwürdiges Problem. Hatte für ca. 2 Stunden einen dhcp-Server installiert und am Laufen. Nach dem Löschen des Pakets mit rpm gab es ein Verzeichnis mit lease-Daten, was nicht automatisch gelöscht wurde. In diesem Verzeichnis lagen über 60000!!! Dateien. 1. Frage: Wieso legt der DHCP-Server so viele Dateien in so kurzer Zeit an? 2. Frage: Warum kann ich die nicht alle mit einmal (rm -rvf *) löschen? rm meinte, es wären zu viele Dateien. Ist das normal? Sind beides keine wichtigen Probleme, aber ich bin neugierig. :-) MfG Kay
Am 17.08.2005 um 14:13 schrieb Kay Patzwald:
ich hatte vor kurzem ein merkwürdiges Problem. Hatte für ca. 2 Stunden einen dhcp-Server installiert und am Laufen. Nach dem Löschen des Pakets mit rpm gab es ein Verzeichnis mit lease-Daten, was nicht automatisch gelöscht wurde. In diesem Verzeichnis lagen über 60000!!! Dateien. 1. Frage: Wieso legt der DHCP-Server so viele Dateien in so kurzer Zeit an?
Kann ich nicht beantworten.
2. Frage: Warum kann ich die nicht alle mit einmal (rm -rvf *) löschen? rm meinte, es wären zu viele Dateien. Ist das normal?
Ja, das ist normal. Der Grund liegt in dem Weg, wie die Shell den Wildcard, also das Sternchen, expandiert. Bevor dir Shell das Kommando "rm" ausführt, ersetzt sie den Wildcard durch eine Liste aller (passenden) Dateien. D.h., die Shell versucht ein Programm auszuführen, und diesem Programm 60000 Parameter zu übergeben. Der Kernel hat aber ein Limit für die maximale Länge einer Parameterliste bei exec*-Aufrufen. Die Shell überschreitet mit ihrem exec*-Aufruf dieses Limit und bekommt den Fehler E2BIG zurückgeliefert. Die Höhe des Limits kannst du mit "getconf ARG_MAX" erfahren. Dein Problem lässt sich auf andere Weise lösen, z.B. durch eine Konstruktion aus "find | xargs rm" (Vorsicht!) bzw 'find -exec'. Gruß, Dennis -- Private Mails bitte an dennis@...! Alles, was an lists@stosberg.net geht und nicht über die Liste kommt, verschwindet ungesehen im Müll.
On Wed, Aug 17, 2005 at 02:13:15PM +0200, Kay Patzwald wrote: [...]
2. Frage: Warum kann ich die nicht alle mit einmal (rm -rvf *) löschen? rm meinte, es wären zu viele Dateien. Ist das normal?
Wilde Vermutung: Wenn Du "rm *" verwendest, wird der '*' durch die Shell durch alle passenden Filenamen ersetzt. Fall nun aber -zigtausend Dateien im Verzeichnis stehen, ist das Ergebnis eine irrsinnig lange Kommandozeile. Ich weiss nicht auswendig, was da die Limits sind, aber ich wuerde mit vorstellen, dass sie bei weitem uebertroffen werden. Moegliche Loesungsansaetze die ich probieren wuerde: "xargs", eine "for" loop mit "rm" oder ein passendes "find" Kommando mit rm. Genaue Syntax kann ich Dir jetzt nicht nennen - muesste ich erst selbst mit "trial and error" finden... ;-) Cheerio, Thomas
Am Mittwoch, 17. August 2005 14:13 schrieb Kay Patzwald:
ich hatte vor kurzem ein merkwürdiges Problem. Hatte für ca. 2 Stunden einen dhcp-Server installiert und am Laufen. Nach dem Löschen des Pakets mit rpm gab es ein Verzeichnis mit lease-Daten, was nicht automatisch gelöscht wurde. In diesem Verzeichnis lagen über 60000!!! Dateien. 1. Frage: Wieso legt der DHCP-Server so viele Dateien in so kurzer Zeit an? keine Ahnung.
2. Frage: Warum kann ich die nicht alle mit einmal (rm -rvf *) löschen? rm meinte, es wären zu viele Dateien. Ist das normal?
Die Länge einer Kommandozeile eines Programmaufrufes ist begrenzt, unter Linux glaube ich bei ca. 20kb Zeichen. Daher kann so ein Aufruf schief gehen. Wenn man also weiss, daß sie Kommandozeile zu langen werden kann bietet sich folgendes an: ls DIR | xargs rm xargs ist Ein Programm welches die Argumente des auszuführenden Programms (hier rm) von stdin liest und das Programm (rm) mit einer möglichst langen Kommandozeile mehrfach aufruft, bis alle Argumente verarbeitet werden. Das funktioniert gut, wenn das Programm (hier rm) mehrfach aufgerufen werden darf um seine Aufgabe zu erledigen. Typische Anwendung von xargs ist auch: find DIR .... | xargs cmd das ist schneller als find DIR ... -exec CMD \{ \} da in letzerem Fall das Programm CMD für jedes Argument aufgerufen wird und mit xargs wei oben beschrieben. Bye Jürgen -- Dr.rer.nat. Juergen Vollmer, Viktoriastrasse 15, D-76133 Karlsruhe Tel: +49(721) 9204871 Fax: +49(721) 24874 Juergen.Vollmer@informatik-vollmer.de www.informatik-vollmer.de Internet-Telefonie: www.skype.com Benutzer: juergen.vollmer
* Kay Patzwald schrieb:
gelöscht wurde. In diesem Verzeichnis lagen über 60000!!! Dateien.
for i in e*txt; do rm "$i";done in " setzen wenn Namen selber wieder Leerzeichen haben. Vorsicht bei for i in *; do ... weil das * zu viiiiiiel mehr Dateien aufgelöst wird als Dir lieb ist ;-) sieh es Dir mal mit echo $i statt rm $i an. Ekkard
participants (5)
-
Dennis Stosberg
-
Dr. Jürgen Vollmer
-
Ekkard Gerlach
-
Kay Patzwald
-
T. Ribbrock