du kann nicht auf die Datei zugreifen - Fehler „Keine solche Datei oder kein solches Verzeichnis“

du kann nicht auf die Datei zugreifen - Fehler „Keine solche Datei oder kein solches Verzeichnis“

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

dufunktioniert wie jeder Befehl, der Verzeichnisbäume rekursiv durchläuft, folgendermaßen:

  1. Informationen über eine Datei lesen, auf die über ihren Pfad zugegriffen wird¹. Im Fall von du, der Systemaufrufstatgibt den Dateityp (insbesondere ob es sich um ein Verzeichnis handelt) und die Größe an. Die Namen werden zunächst aus der Kommandozeile übernommen.
  2. Wenn die Datei ein Verzeichnis ist,offenes undlesendie Liste der Dateinamen.
  3. 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

rmwird ausgeführt und löscht Dateien nacheinander. Gelegentlich duliest in Schritt 2 einen Dateinamen, aber bis er in Schritt 3 verarbeitet wird, rmhat er ihn bereits gelöscht. Ob dieser Fehler überhaupt auftritt und wie oft, hängt von der relativen Geschwindigkeit von rmund ab duund 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 duFehler 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 duBefehl die Größe nicht angeben konnte und warum er den Fehler meldet, wenn der rmBefehl die Verknüpfung der Dateien aufgehoben hat.

Dies wird erklärt inDasLink. Ich formuliere es nur anders, um zu sehen, was hier passiert ist.

  1. Der rmBefehl hat die Verknüpfung der Datei aufgehoben (d. h. den Dateinameneintrag aus dem übergeordneten Verzeichnis gelöscht).
  2. Der Datei-Handle bleibt jedoch weiterhin gültig, auch wenn ihm kein Dateiname zugeordnet ist. Hier dumeldet 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 pidden RM-Prozess mit psdem 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 rmBefehl noch ausgeführt wird, dumeldet der Befehl den Fehler.

verwandte Informationen