Das Erstellen, Löschen und Ändern von Dateien ist eine der häufigsten Aufgaben für Systemadministratoren . Diese Art von Aufgaben wird in Ihrem Alltag häufig ausgeführt. Es kann schnell gehen, wenn es sich um eine oder zwei Dateien handelt, aber die Sache wird kompliziert, wenn die Anzahl zunimmt.
Wenn die Anzahl der Dateien mehr als 6 Stellen beträgt, müssen wir sehr vorsichtig sein, da dies ewig dauern und sogar das gesamte System zum Erliegen bringen kann. Ich empfehle, zu wissen, wie Sie die Aufgabe angehen und den Befehl verwenden, der für Sie in Abhängigkeit von Ihrem Dateisystem und insbesondere der Anzahl der Dateien geeignet ist.
Wenn wir über die Dateien in Linux sprechen, basiert alles mehr auf den Inodes als auf den Dateien, über die wir sprechen können.
Dies ist eine Datenstruktur, die typisch für Dateisysteme ist, die traditionell in UNIX- ähnlichen Betriebssystemen wie Linux verwendet werden. Ein Inode enthält die Merkmale (Berechtigungen, Daten, Speicherort, aber NICHT den Namen) einer regulären Datei, eines Verzeichnisses oder eines anderen Objekts, das das Dateisystem enthalten kann.
Wie Inodes erstellt werden und ob sie erstellt werden, hängt vom jeweiligen Dateisystem ab. Mehrere Dateisysteme erstellen alle Inodes, wenn das Dateisystem selbst erstellt wird, was zu einer festen Anzahl von Inodes führt. Beispielsweise ist ext3 ein Dateisystem, das dies ausführt. Das Ergebnis ist, dass das Dateisystem über eine bestimmte Anzahl von Dateien verfügt, die gespeichert werden können. Ja – es ist tatsächlich möglich, die Kapazität auf dem Speichermedium zu haben und nicht mehr Daten zu speichern. Wenn Sie mehr Inodes benötigen, müssen Sie das Dateisystem neu erstellen, wobei alle darin enthaltenen Daten verloren gehen.
Ein Weg, um die Falle der festen Anzahl von Inodes zu umgehen, ist etwas, das von einigen Dateisystemen verwendet wird und das als Ort und / oder dynamische Erweiterung von Inodes bezeichnet wird. Diese Dateisysteme können grundsätzlich das Dateisystem vergrößern und / oder die Anzahl der Inodes erhöhen.
Denken Sie daran, dass Linux im Allgemeinen mit POSIX kompatibel ist, für das bestimmte Dateiattribute erforderlich sind. Insbesondere
- Geräte-ID
- Datei Benutzer ID
- Gruppen-ID der Datei
- Der Dateimodus, der den Dateityp bestimmt und wie der Eigentümer, die Gruppe und andere (der Rest) auf die Datei zugreifen können
- Zusätzliche System- und Benutzerflags zum weiteren Schutz der Datei (Hinweis: Dies kann verwendet werden, um die Verwendung und Änderung von Dateien einzuschränken.)
- Zeitstempel, die angeben, wann der Inode selbst zuletzt geändert wurde (ctime, “change time”), wann der Inhalt der Datei zum letzten Mal geändert wurde (mtime, “modification time”) und wann auf die Datei zuletzt zugegriffen wurde Zeit (atime “Zugriffszeit”)
- Ein Verbindungszähler, der angibt, wie viele feste Verbindungen auf den Inode verweisen.
- Zeiger auf Plattenblöcke, in denen der Inhalt der Datei gespeichert ist.
Jedes Linux-Dateisystem, das POSIX unterstützt, muss diese Informationen für jede Datei im Inode enthalten haben oder in der Lage sein, diese Informationen so zu reproduzieren, als ob es Inodes gäbe.
Die Geschwindigkeit, mit der eine Datei verschoben, geändert oder gelöscht wird, hängt von der Anzahl der Inodes und dem zu verwendenden Befehl ab.
Testumgebung generieren
Wir werden ein kleines Labor erstellen, ein Verzeichnis erstellen und darin 500.000 Dateien generieren, und wir werden sie mit einigen Befehlen beseitigen und die Geschwindigkeit sehen.
Wir erstellen das Verzeichnis:
$ mkdir test
Wir erstellen 500000 TXT-Dateien mit einer einfachen Bash-Schleife im aktuellen Verzeichnis.
$ für i in $ (Seq. 1 500000); Echotest durchführen >> $ i.txt; fertig
Es wird bereits erstellt.
Mit dem Befehl rm
Wir beginnen mit dem einfachsten Befehl unter Linux
$ Zeit rm -f *
Da es sich um eine sehr große Anzahl von Dateien handelt, hilft uns der Befehl rm bei dieser Aufgabe nicht, den Fehler auszulösen.
-bash: / bin / rm: Argumentliste zu lang
Verwenden des Befehls “Suchen”
Dieses Mal werden wir den gleichen Test durchführen, aber find mit dem Argument -exec verwenden
$ time find / test / -type f -exec rm {} ; echte 14m51.735s Benutzer 2m24.330s sys 9m48.743s
Wir können sehen, dass der Befehl in fast 15 Minuten ausgeführt wurde.
Wir werden denselben Befehl find verwenden, jedoch mit der Option -delete
$ time find / test / -type f -delete echte 5m11.937s Benutzer 0m1.259s sys 0m28.441s
Wir sehen, dass er wieder in der Lage war, alle Dateien zu löschen, aber diesmal viel schneller in etwas mehr als 5 Minuten. Dies ist eine hervorragende Zeit, wenn man bedenkt, dass es fast eine halbe Million Dateien gibt.
Perl verwenden
Dieses Mal werden wir die Perl-Sprache verwenden, um alle Dateien im Verzeichnis zu löschen.
time perl -e 'for (<*>) {((stat) [9] <(unlink))}' echte 1m0.488s Benutzer 0m7.023s sys 0m27.403s
Es ist extrem schnell im Vergleich zu den vorherigen, aber der Verbrauch ist etwas hoch, um mit diesem Befehl vorsichtig zu sein. Ich verwende Perl, um Dateien zu löschen, aber in Skripten, die manchmal ohne viel Verkehr laufen, oder Sie können das System aufgrund von Ressourcenmangel aufhängen.
Verwenden von RSYNC
Zum Abschluss verwenden wir das Tool Nummer 1 für die RSYNC-Sicherung, das zwar Ihrer Meinung nach nicht zum Löschen von Dateien verwendet werden kann. Für diesen Test synchronisieren wir den Testordner mit einem völlig leeren neuen.
$ time rsync -a - leeres Debug / test / echte 2m52.502s Benutzer 0m2.772s sys 0m32.649s
Wir sehen, dass alle Dateien in fast 3 Minuten gelöscht werden und die verwendeten Ressourcen im Vergleich zu den vorherigen geringer sind.