GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Wie geht Rm -r beim rekursiven Entfernen vor? In welcher Reihenfolge?

Gibt es eine bestimmte Reihenfolge der Operationen für rm ? Ich habe rm ausgeführt auf einem großen Verzeichnis und bin gespannt, wo ich nachsehen soll, was evtl. gelöscht wurde. Hat rm zuerst an Dateien arbeiten, dann an Verzeichnissen? Oder basiert es auf einigen Informationen in der Inode-Tabelle?

Spezifikationen:rm von GNU Coreutils 8.22
System:Arch Linux, das auf einem Beagleboneblack
-Dateisystem ausgeführt wird, das auf einer externen Festplatte von Seagate (ext4) mit USB 2.0 betrieben wird.

Hintergrundgeschichte:

Ich habe einige Verzeichnisbereinigungen durchgeführt und

durchgeführt
cp -r A/ B/ C/ Dest/

Unwissentlich folgte ich dem mit

rm -r A/ B/ C/ Dest/

als ich nur performen wollte

rm -r A/ B/ C/

Ich habe das abgefangen und Strg gedrückt +C bevor zu lange vergangen war. Insbesondere waren es <3 Sekunden, da ich die time verwendet habe Befehl in Verbindung mit rm &cp . Ich ging hinein und untersuchte Dest/ erwartet, dass es nicht existiert, aber siehe da, es war ganz und erschien nicht betroffen sein. Das ist etwas überraschend, da A/ B/ C/ waren recht klein. Vielleicht 100–200 MB insgesamt. Dest/ ist jedoch nur knapp 1 TB. Durchführen eines ls auf Dest/ zeigte, dass es sowohl Dateien als auch Verzeichnisse an beiden Enden des Alphabets gab (z. B. AFile.txt …. …. Zoo.txt ).

Habe ich Glück gehabt und den rm gekündigt bevor es mein Dest/-Verzeichnis verwüstete? Ist rm wirklich so langsam (zum Glück!)?

Wenn nicht, wie funktioniert rm Dinge rekursiv entfernen, sodass ich erraten kann, was verloren gegangen sein könnte?

Ich erwarte nicht wirklich, das zurückzugewinnen, was ich verloren haben könnte, ich bin nur neugierig, was möglicherweise weggeblasen wurde.

Akzeptierte Antwort:

rm -r arbeitet nacheinander an jedem seiner Argumente. Wenn ein Argument ein Verzeichnis ist, listet es das Verzeichnis auf (mit dem opendir und readdir Funktionen oder eine äquivalente Methode) und verarbeitet jeden Eintrag der Reihe nach. Wenn ein Eintrag ein Verzeichnis ist, wird dieser Eintrag rekursiv untersucht.

Dies ist genau die gleiche Methode, die andere Anwendungen verwenden, um Verzeichnisse rekursiv zu durchlaufen – find , ls -Rf usw.

Die Reihenfolge der Traversierung ist nicht vorhersehbar. Auf den meisten Dateisystemen ist die Reihenfolge reproduzierbar, solange keine Datei im Verzeichnis hinzugefügt, entfernt oder umbenannt wird (die Reihenfolge könnte theoretisch völlig zufällig sein und sich jedes Mal ändern, aber ich kann mir kein Dateisystem vorstellen, in dem das passiert). Bei einigen Dateisystemen kann die Reihenfolge im Allgemeinen aus den Dateinamen oder aus der Reihenfolge, in der die Dateien erstellt wurden, oder einer Kombination aus beidem abgeleitet werden, aber Sie müssen die feinen Details des Dateisystems kennen und können je nach variieren die Treiberversion. Auf die Reihenfolge der Traversierung können Sie sich nicht verlassen.

Verwandte:Optimieren der logischen Sektorgröße für die physische Sektorgröße 4096 HDD?

Beachten Sie, dass ls oder echo * sortieren Sie Dateien in lexikografischer Reihenfolge ihrer Namen. find und ls -f nicht sortieren.

Das Einzige, worauf Sie sich verlassen können, ist, dass die Argumente der Reihe nach behandelt werden. Wenn also C/ noch teilweise vorhanden wäre, würde dies bedeuten, dass Dest/ war unberührt. Wenn C/ weg ist, können Sie sich ein Bild davon machen, wo Dateien in Dest/ entfernt wurden indem Sie die Änderungszeiten des Verzeichnisses überprüfen und mit der Zeit C/ vergleichen gelöscht wurde oder wann die Kopie beendet wurde. Die erste zu löschende Datei könnte eine Datei direkt in Dest/ sein oder irgendwo tief in der Hierarchie, je nachdem, ob der erste Eintrag in Dest/ dieser rm zufällig zu durchlaufen war ein Verzeichnis oder nicht.

Die Geschwindigkeit von rm kommt es vor allem darauf an, wie viele Dateien gelöscht werden sollen. Es braucht eine sehr große Datei, um die Löschzeit spürbar zu beeinflussen. Der Großteil der Arbeit besteht darin, jeden Verzeichniseintrag der Reihe nach zu löschen. Die Daten der Datei werden nicht gelöscht, das Löschen des Inhalts einer Datei erfordert nur das Markieren der verwendeten Blöcke als frei, was relativ schnell geht.


Linux
  1. Was ist ein Webserver und wie funktioniert ein Webserver?

  2. So finden Sie heraus, was ein Linux-Befehl tut

  3. Was macht ?

  4. Wie kann ich sehen, was der DHCP-Client tut?

  5. Was macht kill -- -0?

Was ist Hadoop Mapreduce und wie funktioniert es?

Linux-Dateibefehl:Was macht er und wie wird er verwendet?

Was ist Docker? Wie funktioniert es?

Was ist Source Command in Linux und wie funktioniert es?

Wie funktioniert ein Load Balancer? Was ist Load-Balancing?

So finden Sie heraus, welche Datei sich in einem bestimmten Sektor befindet