
Ich habe viele Unterordner in einem bestimmten Ordner, der wiederum viele kleinere Dateien enthält. Sie werden programmgesteuert erstellt und daher weiß ich nicht, wie viele davon sich darin befinden.
Ich beschloss, alle diese Unterordner und Dateien zu entfernen und gab den Befehl ein,
rm -rf foldername/
Die Ausführung des RM-Befehls dauert jedoch so lange, was meiner Ansicht nach völlig normal ist, da alle Dateien getrennt werden müssen.
Ich habe mich jedoch entschlossen zu prüfen, ob die Größe dieses Ordners durch die Ausgabe des folgenden Befehls reduziert wird:
du -sh foldername/
Der obige Befehl gibt mir jedoch den folgenden Fehler aus:
du: cannot access `foldername/file': No such file or directory
Warum tritt dieser Fehler auf?
Antwort1
du
funktioniert wie jeder Befehl, der Verzeichnisbäume rekursiv durchläuft, folgendermaßen:
- Informationen über eine Datei lesen, auf die über ihren Pfad zugegriffen wird¹. Im Fall von
du
, der Systemaufrufstat
gibt den Dateityp (insbesondere ob es sich um ein Verzeichnis handelt) und die Größe an. Die Namen werden zunächst aus der Kommandozeile übernommen. - Wenn die Datei ein Verzeichnis ist,offenes undlesendie Liste der Dateinamen.
- Erstellen Sie für jeden Dateinamen im Verzeichnis einen Dateipfad ( ) und arbeiten Sie rekursiv darauf, beginnend bei Schritt 1. Dieser Schritt kann teilweise parallel zum vorherigen ausgeführt werden (dies hängt von der Implementierung ab).
DIRECTORY/ENTRY_NAME
rm
wird ausgeführt und löscht Dateien nacheinander. Gelegentlich du
liest in Schritt 2 einen Dateinamen, aber bis er in Schritt 3 verarbeitet wird, rm
hat er ihn bereits gelöscht. Ob dieser Fehler überhaupt auftritt und wie oft, hängt von der relativen Geschwindigkeit von rm
und ab du
und ist ziemlich unvorhersehbar.
¹ Es gibt nur zwei Möglichkeiten, direkt auf eine Datei zuzugreifen: über den Pfad (einschließlich Verzeichnisinformationen, relativ oder absolut) oder (wenn die Datei geöffnet ist) über den Deskriptor.
Antwort2
Ignorieren Sie einfach den du-Befehlsfehler
GemäßDasLink, ich könnte die du
Fehler ignorieren, indem ich nur erwähne,
du 2> >(grep -v '^du: cannot \(access\|read\)' >&2)
Aber ich bin genauer daran interessiert, was beim Löschen von Dateien passiert. Besonders interessiert mich, warum der du
Befehl die Größe nicht angeben konnte und warum er den Fehler meldet, wenn der rm
Befehl die Verknüpfung der Dateien aufgehoben hat.
Dies wird erklärt inDasLink. Ich formuliere es nur anders, um zu sehen, was hier passiert ist.
- Der
rm
Befehl hat die Verknüpfung der Datei aufgehoben (d. h. den Dateinameneintrag aus dem übergeordneten Verzeichnis gelöscht). - Der Datei-Handle bleibt jedoch weiterhin gültig, auch wenn ihm kein Dateiname zugeordnet ist. Hier
du
meldet der Befehl, dass er die Datei oder das Verzeichnis nicht sieht.
Überprüfung
Ich habe weitere Nachforschungen angestellt, um sicherzustellen, dass die Dateien tatsächlich nicht verknüpft sind.
Ich habe pid
den RM-Prozess mit ps
dem Befehl erhalten. Jetzt habe ich den folgenden Befehl eingegeben, um zu sehen, ob die Dateien noch verfügbar sind.
lsof +L | grep 11771
Der obige Befehl hat mir die folgende Ausgabe gegeben.
rm 11771 root 4r DIR 8,17 175882240 2 47333397 /foldername/filename
Gemäß der obigen Ausgabe ist die Verknüpfung der Datei also aufgehoben.
Da der rm
Befehl noch ausgeführt wird, du
meldet der Befehl den Fehler.