Frage Nicht in der Lage, viele Dateien auf einmal in Linux zu löschen


Ich habe den folgenden Befehl innerhalb dieser Protokollordner ausgeführt. Aber es sieht so aus, als würde jeder Ordner unendlich lange dauern.

finden . -type f -exec rm -v {} \;

rwxrwxr-x  2 root     root      77881344 Mar 16 03:06 logs.123  
drwxrwxr-x  2 root     root     105709568 Nov 14 20:09 logs_15Nov2011  
drwxrwxr-x  2 root     root       6852608 Aug  1  2011 logs2  
drwxrwxr-x  2 root     root     286191616 Nov  2 08:40 logs_2Nov  
drwxrwxr-x  2 root     root      25206784 Nov 10 04:04 logs_del  
drwxrwxr-x  4 root     root       2686976 Oct  6 01:56 logs_delete  
drwxrwxr-x  2 root     root          4096 May 11  2011 logsMay112011  
drwxrwxr-x  2 root     root      69087232 Aug 29  2011 logs_old  
drwxrwxr-x  7 root     root     382480384 May  9  2011 logs.old905  
drwxrwxr-x  2 root     root          4096 May 11  2011 logsTR1218

Jeder Vorschlag besser und schneller als das alle diese Protokolle zu entfernen?


5
2018-03-16 10:11


Ursprung


Was ist der Typ Ihres Dateisystems? Wenn ext2 / 3/4, verwenden Sie Verzeichnisindizierung (wiki.archlinux.org/index.php/Ext3#Using_Directory_Indexing) - jfg956
Dies steht nicht in direktem Zusammenhang mit Ihrer Frage, aber nachdem Sie diese alten Protokolle löschen können, schauen Sie in logrotate um dieses Problem in Zukunft zu vermeiden: linuxcommand.org/man_pages/logrotate8.html - Ben Lee


Antworten:


GNU find hat die Option -delete, die immer sicher ist:

find . -type -f -delete

Wie an anderer Stelle erwähnt, können Sie auch XARGs verwenden, aber seien Sie sehr vorsichtig, wie Sie es verwenden.

find . -type f -print0 | xargs -0 rm -vf

6
2018-03-16 11:59



Zu mir vom Endergebnis sehen beide Befehle gleich aus. Kannst du bitte erklären, warum man mit dem zweiten Befehl vorsichtiger sein muss, danke. - Vivek Sharma
Denn ohne NUL-terminierte Dateinamen (Strings) können unerwartete Ergebnisse auftreten - etwas, das Sie nicht wollen rm! Überlegen Sie, was passiert, wenn Sie "rm -rf / etc foo" ausführen, also ein Verzeichnis mit dem Namen "etc foo" löschen, was ein absolut gültiger Dateiname ist. Ohne richtige Zitate werden Sie Ihr System zerstören. - adaptr


Alle anderen Antworten gehen davon aus, dass Sie die Verzeichnisse behalten möchten, aber aus Ihrer ursprünglichen Nachricht, die Sie tun, ist nicht klar; Außerdem, selbst wenn Sie die Struktur beibehalten wollten, müssen Sie die Verzeichnisse trotzdem entfernen und neu erstellen, weil die Verzeichnisdateien geworden sind sehr groß - sie werden nicht schrumpfen, wenn Sie sie leeren, und ihre Größe wird Operationen in ihnen in Zukunft massiv verlangsamen.

Also hast du gerade überlegt

rm -rf log*

2
2018-03-16 12:21



Wenn find -exec nicht alle Argumente in einer einzigen Befehlszeile ablegen kann, wird dies auch für jeden anderen Befehl gelten - einschließlich rm. - adaptr
adaptr, stimme ich zu - deshalb schlage ich vor, die rekursive rm aus dem übergeordneten Verzeichnis, wo es nicht viele Dateien gibt, zu tun, und die Glob-Erweiterung wird die Shell nicht brechen. - MadHatter
MadHatter - Ich will Verzeichnisse nicht behalten, aber der Befehl antwortet einfach nicht. Und manchmal aufgrund von Internet-Problemen schließen Kitte und der Befehl wird beendet. - Vivek Sharma
Es reagiert nicht, weil es eine Menge Arbeit zu tun hat, und es ist extrem ineffiziente Arbeit dank der Größe dieser Verzeichnisse. Trotzdem schreitet es voran; Sie sollten wahrscheinlich die man-Seite auf dem Bildschirm Befehl lesen und starten Sie die rm in einer Bildschirmsitzung, dies ermöglicht zu befehlen, weiter zu laufen, auch wenn Ihre SSH-Sitzung trennt, und Sie können es wieder verbinden, sobald Sie eine neue SSH-Sitzung. Oder einfach nur den Job im Hintergrund: rm -rf log* & . - MadHatter
rm -rf log * &, ja, das machen wir jetzt. Trotzdem vielen Dank. - Vivek Sharma


Wenn Sie die vielen Fehler verwalten können, wenn rm Verzeichnisse nicht löschen kann, können Sie das Problem von der anderen Seite her angehen

for dir in $(find . -type d)
do
  rm $dir/*
done

1
2018-03-16 10:32



rm -r wird auch gelöscht leeren Verzeichnisse im angegebenen Baum. - adaptr


Versuchen

find . -type f | xargs rm -vf

0
2018-03-16 10:34



Xargs ist gefährlich wenn es in Kombination mit einem Befehl verwendet wird, der Daten ändert. Wenn Sie Xargs verwenden müssen, verwenden Sie stattdessen sichere, NULL-terminierte Strings: find . -type f -print0 | xargs -0 rm -vf - adaptr


Abgesehen von der Neuformatierung der Partition sehe ich keinen schnelleren Weg, alle Dateien zu löschen.

Das Problem ist, dass Sie eine große Menge an Dateien in diesen Verzeichnissen haben (die Größe in der ls -l Ausgabe, die Sie zur Verfügung stellen, ist enorm!). Für jeden rmDas Dateisystem muss Folgendes tun:

  1. Fragt das Verzeichnis nach Inode Nummer,
  2. Aktualisieren Sie das Verzeichnis, um die Datei daraus zu entfernen.
  3. Verringert die Linkanzahl des Inode (siehe feste Verbindung Wenn Sie mehr über die Anzahl der Links erfahren möchten,
  4. Wenn die Anzahl der Verknüpfungen null ist, entfernen Sie die Daten von der Festplatte.

Auch wenn Sie rm In dem Verzeichnis werden Sie nur den obigen Schritt 2 los, da Sie das Verzeichnis noch abfragen und die Linkanzahl verringern müssen. Das Abfragen des Verzeichnisses könnte optimiert werden, um mehr als eine Inode-Nummer zu dem Zeitpunkt zu erhalten, aber in jedem Fall muss das Dateisystem für jede zu löschende Datei den Inode auf die Linkanzahl überprüfen und den Inode aktualisieren (oder zum Löschen markieren).

Mit anderen Worten, diese Operation ist O(n) auf die Anzahl der zu löschenden Dateien, die in Ihrem Fall sehr groß ist.

Wenn Sie Ihre Partition nicht formatieren können, was ich denke, ist Ihr Fall ;-), starten Sie die Aufgabe einfach im Hintergrund oder in einem Bildschirm und sei geduldig.

Eine andere Lösung besteht darin, die zu speichernden Dateien zu sichern, die Partition zu formatieren und die Dateien wiederherzustellen. Vielleicht ist es schneller als das Löschen aller Dateien, aber es ist zeitaufwendiger (die find...rm kann bei Bedarf im Hintergrund für viele Tage vergessen werden ...).


0
2018-03-17 15:09