¿Cómo funciona rm -r para eliminar recursivamente? ¿En qué orden?

30

¿Hay algún orden de operaciones para rm? Realicé rmen un directorio grande y tengo curiosidad sobre dónde debería mirar para ver qué podría haber sido eliminado. ¿ rmFunciona primero en archivos, luego en directorios? ¿O se basa en alguna información en la tabla de inodo?

Especificaciones: rm del sistema GNU coreutils 8.22: Arch Linux que se ejecutaba en un sistema de archivos beagleboneblack que funcionaba era un HDD externo de Seagate (ext4) que usaba USB 2.0.

Historia de fondo:

Estaba realizando una limpieza de directorio y realicé

cp -r A/ B/ C/ Dest/

Inconscientemente, seguí eso con

rm -r A/ B/ C/ Dest/

cuando quise realizar simplemente

rm -r A/ B/ C/

Capté esto y presioné Ctrl+ Cantes de que hubiera pasado demasiado tiempo. Específicamente, fue <3 segundos ya que estaba usando el timecomando junto con rm& cp. Entré y examiné Dest/esperando que no existiera, pero he aquí que estaba completo y parecía no verse afectado. Esto es un poco sorprendente, ya que A/ B/ C/eran bastante pequeños. Tal vez 100–200 MB en total. Dest/Sin embargo, apenas tiene 1 TB. Realizar un lsen Dest / mostró que había archivos y directorios en ambos extremos del alfabeto (por ejemplo, AFile.txt.... .... Zoo.txt).

¿Tuve suerte y cancelé el rmantes de que causara estragos en mi directorio Dest /? ¿Es rmrealmente tan lento (afortunadamente)?

Si no es así, ¿cómo se realiza la rmeliminación recursiva de cosas de modo que pueda adivinar lo que podría haberse perdido?

Realmente no espero recuperar lo que podría haber perdido, solo tengo curiosidad por saber qué fue lo que potencialmente me impresionó.

N Klosterman
fuente

Respuestas:

34

rm -rtrabaja en cada uno de sus argumentos a su vez. Si un argumento es un directorio, enumera el directorio (con las funciones opendiry readdiro algún método equivalente), y opera en cada entrada a su vez. Si una entrada es un directorio, explora esa entrada de forma recursiva.

Este es exactamente el mismo método que otras aplicaciones utilizan para recorrer directorios de forma recursiva - find, ls -Rf, etc.

El orden de recorrido es impredecible. En la mayoría de los sistemas de archivos, el orden es reproducible siempre que no se agregue, elimine o cambie el nombre del archivo en el directorio (el orden en teoría podría ser completamente aleatorio y cambiar cada vez, pero no puedo pensar en un sistema de archivos donde eso suceda). En algunos sistemas de archivos, el orden en general puede deducirse de los nombres de los archivos o del orden en que se crearon los archivos o de una combinación de ambos, pero debe conocer los detalles del sistema de archivos, y puede variar dependiendo de La versión del controlador. El orden de recorrido no es algo en lo que pueda confiar.

Tenga en cuenta que lso echo *ordenar los archivos en orden lexicográfico de sus nombres. findy ls -fno ordenar.

Lo único en lo que puede confiar es que los argumentos se manejan en orden. Entonces, si C/todavía estaba parcialmente allí, significaría que Dest/no se había tocado. Si C/desapareció, puede tener una idea de dónde se han eliminado los archivos Dest/al verificar los tiempos de modificación del directorio y compararlos con el momento en que C/se eliminó o el momento en que finalizó la copia. El primer archivo que se eliminará podría ser un archivo directamente dentro Dest/o en algún lugar profundo de la jerarquía, dependiendo de si la primera entrada Dest/que rmsucedió en el recorrido fue un directorio o no.

La velocidad de rmes principalmente una cuestión de cuántos archivos hay que eliminar. Se necesita un archivo muy grande para tener un impacto notable en el tiempo de eliminación. La mayor parte del trabajo es eliminar cada entrada de directorio a su vez. Los datos del archivo no se borran, borrar el contenido de un archivo solo requiere marcar los bloques que estaba usando como gratuitos, lo cual es relativamente rápido.

Gilles 'SO- deja de ser malvado'
fuente
2
La -fopción de lsestá documentada como equivalente a -aU, donde -asignifica listar todos los archivos y -Umedios sin clasificar. Recuerdo vagamente encontrar una versión de la lscual -fno funcionó (creo que se definió como otra cosa) pero -aUsí.
G-Man dice 'Restablecer a Monica' el
2
@ G-Man POSIX define -f(como una extensión XSI ); de hecho tiene otros efectos más allá de los no clasificados. Se remonta a V7, por lo que sería difícil encontrar una implementación sin ella, aparte de, extrañamente, BusyBox. -Uporque solo sin clasificar es una característica de GNU, no creo que exista en ningún otro lugar.
Gilles 'SO- deja de ser malvado'
@Tim No. Puede probar ejecutando ls -Uen un directorio. Este es el mismo orden que rm -rfuncionaría en ese directorio. Tenga en cuenta que agregar o eliminar un archivo puede cambiar el orden de los otros archivos.
Gilles 'SO- deja de ser malvado'
Gracias. (1) "agregar o eliminar un archivo puede cambiar el orden de los otros archivos", por lo tanto, después de la eliminación parcial accidental, ls -U¿no ayuda saber si los directorios sobrevivientes no se han tocado? (2) -U significa "enumerar entradas en orden de directorio". ¿-U significa el orden de las entradas de directorio en el directorio?
Tim
5

Como dice Gilles, generalmente no se puede predecir el orden de las eliminaciones dentro de un directorio, solo que los directorios de nivel superior se procesarán en el orden en la línea de comandos.

Sin embargo, también tiene la garantía de que eliminará las jerarquías de directorios de abajo hacia arriba, porque Unix solo permite que los directorios se eliminen si están vacíos. Entonces, para eliminar un directorio, primero tiene que eliminar todo lo que contiene. Si contiene subdirectorios, primero debe eliminar su contenido, y así sucesivamente.

Barmar
fuente