So entfernen Sie ein Verzeichnis im NFS-Dateisystem mit einer enormen Anzahl von Dateien

So entfernen Sie ein Verzeichnis im NFS-Dateisystem mit einer enormen Anzahl von Dateien

Ein schlecht getestetes Programm hat auf einer NFS-Freigabe ein Verzeichnis mit einer enormen Anzahl von Dateien erstellt, das ich entfernen muss.

ls -ald /home/foo
drwxrwxr-x 2 503 503 317582336 Jul 29 11:38 /home/foo

Das Verzeichnis befindet sich auf einem NFS-Mount von etwa 600 GB auf einem NetApp-ähnlichen Gerät. Ich habe eigentlich keine Ahnung, wie viele Dateien darin sind, aber ein ähnliches Verzeichnis, das nach nur 10 Minuten erstellt wurde, hat 121.000 Dateien, also sind es wahrscheinlich irgendwo Millionen. Das Betriebssystem ist der Linux 2.6-Kernel.

Ich versuche, eine Möglichkeit zu finden, es und seinen Inhalt aufzulisten oder zu entfernen. „find /home/foo“ führt dazu, dass „find“ nach etwa einer Stunde abstürzt und keine andere Ausgabe als „./“ hinterlässt.

Antwort1

(Ich beantworte meine eigene Frage für den Fall, dass sie jemand bei der Suche nach etwas Ähnlichem findet.) Das Verzeichnis enthält möglicherweise bis zu 9 Millionen Dateien.

Leider kann ich mich nicht direkt beim Server anmelden, es handelt sich um eine Appliance. Der einzige Zugriff auf die Dateisysteme erfolgt über den Export.

rm -rf schien nicht zu funktionieren. Beim Beobachten mit Strace blieb es hängen.

Die Suche konnte nicht abgeschlossen werden und ist ohne Fehler beendet.

ls -1 schien nie abgeschlossen zu werden. (Mir ist jetzt klar, dass ls -1f möglicherweise irgendwann funktioniert hat, da es versucht, die Ergebnisse zu sortieren.)

Was funktioniert hat, war ein einfacher Perl-Ausschnitt. Ich gehe davon aus, dass C-Code, der dasselbe tut, funktionieren würde.

 opendir( my $dh,  '/home/foo' ) or die $!
    while ( my $file = readdir $dh ) {
        print "$file\n";
    }

Antwort2

Ich bin auf diesen ziemlich alten Thread bei Google gestoßen und möchte daher einige Statistiken mit Ihnen teilen.

Hier ist ein Vergleich dreier verschiedener Methoden zum Entfernen von Dateien auf einem NFS-Server:

  1. einfaches rm:rm dir/*
  2. finden:find dir/ -type f -exec rm {} \;
  3. rsync:tempdir=$( mktemp -d ); \ rsync -a --delete $tempdir/ dir/; \ rmdir $tempdir

Um diese Methoden zu vergleichen, habe ich bei jedem Test 10000 Dateien erstellt mit

for i in {1..10000} ; do touch $i ; done

Die Ergebnisse im Diagramm zeigen, dass rsync viel schneller ist und find die langsamste der drei Methoden ist Leistung verschiedener Methoden zum Entfernen mehrerer Dateien, rsync ist schneller

Die Ergebnisse bleiben erhalten, wenn die Anzahl der Dateien verdoppelt wird (ich habe keinen Lauf findmit 20.000 Dateien durchgeführt), Zeitdurchschnitt über 3 Läufe für 10.000 Dateien und 2 Läufe für 20.000 Dateien.

        10000    20000
find     28.3       -
rm       12.9     23.9
rsync     6.94    12.2

Es ist interessant zu sehen, wovon die Leistung dieser Methoden sonst noch abhängt.

Eine damit verbundenePostauf dieser Site wird das Löschen einer großen Anzahl von Dateien auf einem Ext3-Dateisystem besprochen.

Antwort3

Ich würde vorschlagen, dass Sie NICHT versuchen, diese Dateien über NFS zu entfernen. Melden Sie sich direkt beim Dateiserver an und löschen Sie die Dateien dort. Dies schadet dem NFS-Server (und dem Client) wesentlich weniger.

Verwenden Sie darüber hinaus „find“ (wie von MattBianco beschrieben) oder „use“ ls -1 | xargs rm -f(aus diesem Verzeichnis heraus), wenn bei „find“ Probleme auftreten (letzteres sollte über NFS problemlos funktionieren, ich würde jedoch auch hier empfehlen, es lokal auszuführen).

Antwort4

Das scheint ein wenig offensichtlich, aber haben Sie Folgendes versucht:

rm -rf /home/foo/

? Wenn das nicht gelingt, gibt es eine Möglichkeit, mithilfe eines regulären Ausdrucks eine ausreichend kleine Teilmenge zu erhalten, die Sie weitergeben können |xargs rm?

Wenn ls fehlschlägt, können Sie echo /home/foo/* | xargs rmes trotzdem versuchen, aber das schlägt möglicherweise mit „Zeile zu lang“ oder Ähnlichem fehl. Oh, und ich unterstütze die Empfehlung, dies direkt auf dem Server statt über NFS zu versuchen.

verwandte Informationen