unix rm – ¿Cómo se elimina rm -r de forma recursiva? ¿En qué orden?

Pregunta:

¿Hay algún orden de operaciones para rm ? rm en un directorio grande y tengo curiosidad por saber dónde debería buscar para ver qué podría haberse eliminado. ¿ rm funciona primero en archivos y luego en directorios? ¿O se basa en alguna información de la tabla de inodo?

Especificaciones: rm del sistema GNU coreutils 8.22: Arch Linux que se ejecuta en un sistema de archivos beagleboneblack en un disco duro externo Seagate (ext4) que usa USB 2.0.

Trasfondo:

Estaba realizando una limpieza de directorio y realicé

cp -r A/ B/ C/ Dest/

Sin saberlo, lo seguí con

rm -r A/ B/ C/ Dest/

cuando quise simplemente actuar

rm -r A/ B/ C/

Capté esto y presioné Ctrl + C antes de que pasara demasiado tiempo. Específicamente, fue <3 segundos ya que estaba usando el comando time junto con rm & cp . Entré y examiné Dest/ esperando que no existiera, pero he aquí que estaba completo y parecía no estar afectado. Esto es un poco sorprendente ya que A/ B/ C/ eran bastante pequeños. Quizás entre 100 y 200 MB en total. Dest/ sin embargo, está por debajo de 1TB. Realizar un ls en Dest / mostró que había archivos y directorios en ambos extremos del alfabeto (por ejemplo, AFile.txt …. …. Zoo.txt ).

¿Tuve suerte y cancelé la rm antes de que causara estragos en mi directorio Dest /? Es rm realmente tan lenta (por suerte!)?

Si no es así, ¿cómo se las rm para eliminar cosas de manera recursiva de modo que pueda adivinar qué se podría haber perdido?

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

Respuesta:

rm -r trabaja en cada uno de sus argumentos por turno. Si un argumento es un directorio, enumera el directorio (con las funciones opendir y readdir o algún método equivalente) y opera en cada entrada por turno. Si una entrada es un directorio, explora esa entrada de forma recursiva.

Este es exactamente el mismo método que usan otras aplicaciones 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 de ningún archivo en el directorio (en teoría, el orden 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 se puede deducir en general de los nombres de los archivos o del orden en el que se crearon o una combinación de ambos, pero es necesario conocer los detalles finos del sistema de archivos, y podría variar según la versión del controlador. El orden de recorrido no es algo en lo que pueda confiar.

Tenga en cuenta que ls o echo * clasifican los archivos en el orden lexicográfico de sus nombres. find y ls -f no clasifican.

En lo único en lo que puede confiar es en que los argumentos se manejan en orden. Entonces, si C/ todavía estaba parcialmente allí, significaría que Dest/ estaba intacto. Si C/ desaparece, puede tener una idea de dónde se eliminaron los archivos en Dest/ verificando las horas de modificación del directorio y comparándolas con la hora en que se eliminó C/ o la hora en que finalizó la copia. El primer archivo que se eliminará podría ser un archivo directamente en Dest/ o en algún lugar profundo de la jerarquía, dependiendo de si la primera entrada en Dest/ que rm atravesó fue un directorio o no.

La velocidad de rm principalmente 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 consiste en eliminar cada entrada del directorio por turno. Los datos del archivo no se borran, borrar el contenido de un archivo solo requiere marcar los bloques que estaba usando como libres, lo cual es relativamente rápido.

Leave a Comment

Your email address will not be published. Required fields are marked *

Scroll to Top

web tasarım