¿Cómo hace rm -r para eliminar de forma recursiva? ¿En qué orden?

¿Cómo hace rm -r para eliminar de forma recursiva? ¿En qué orden?

¿Existe algún orden de operaciones rm? Funcioné rmen un directorio grande y tengo curiosidad por saber dónde debería buscar para ver qué se pudo haber eliminado. ¿ rmFunciona primero con archivos y luego con directorios? ¿O se basa en alguna información de la tabla de inodos?

Especificaciones: rm del sistema GNU coreutils 8.22: Arch Linux ejecutándose en un sistema de archivos beagleboneblack que operaba en un disco duro externo Seagate (ext4) que usaba USB 2.0.

Trasfondo:

Estaba realizando una limpieza de directorio y realicé

cp -r A/ B/ C/ Dest/

Sin darme cuenta, seguí eso con

rm -r A/ B/ C/ Dest/

cuando quise simplemente actuar

rm -r A/ B/ C/

Capté esto y presioné Ctrl+ Cantes de que pasara demasiado tiempo. Específicamente, fueron <3 segundos porque estaba usando el timecomando junto con rm& cp. Entré y lo examiné Dest/esperando que no existiera, pero he aquí que estaba completo yapareciópara no verse 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, apenas llega a 1 TB. Realizar una prueba lsen Dest/ mostró que había archivos y directorios en ambos extremos del alfabeto (por ejemplo AFile.txt... .... Zoo.txt).

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

Si no es así, ¿cómo se pueden rmeliminar cosas de forma recursiva para poder adivinar qué podría haberse perdido?

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

Respuesta1

rm -rtrabaja en cada uno de sus argumentos por turno. Si un argumento es un directorio, enumera el directorio (con elopendiryreaddirfunciones 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 utilizan 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 generalmente se puede deducir de los nombres de los archivos o del orden en que se crearon los archivos o una combinación de ambos, pero es necesario conocer los detalles finos del sistema de archivos, y podría variar dependiendo de la versión del controlador. El orden de recorrido no es algo en lo que pueda confiar.

Tenga en cuenta que lsordene echo *los archivos en orden lexicográfico según sus nombres. findy ls -fno ordenar.

Lo único en lo que puede confiar es en que los argumentos se manejan en orden. Entonces, si C/todavía estuviera parcialmente allí, significaría que Dest/no fue tocado. Si C/desapareció, puede tener una idea de dónde se eliminaron los archivos Dest/verificando las horas de modificación del directorio y comparándolas con la hora C/en que se eliminaron 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 Dest/que rmse atravesó fue un directorio o no.

La velocidad rmdepende principalmente de cuántos archivos hay que eliminar. Se necesita un archivo muy grande para que tenga 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 sólo requiere marcar los bloques que estaba usando como libres, lo cual es relativamente rápido.

Respuesta2

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 comando.

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

información relacionada