GNU/Linux >> Tutoriales Linux >  >> Linux

¿Cómo hace Rm -r para eliminar recursivamente? ¿En qué orden?

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

Especificaciones:rm de GNU coreutils 8.22
sistema:Arch Linux ejecutándose en un sistema de archivos beagleboneblack
operando en un Seagate HDD externo (ext4) usando USB 2.0.

Historia de fondo:

Estaba realizando una limpieza de directorio y realicé

cp -r A/ B/ C/ Dest/

Sin darme cuenta, 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, fueron <3 segundos mientras usaba el time comando junto con rm &cp . Entré y examiné Dest/ esperando que no existiera, pero he aquí que estaba completo y aparece para no verse afectado. Esto es un poco sorprendente ya que A/ B/ C/ eran bastante pequeños. Tal vez entre 100 y 200 MB en total. Dest/ sin embargo, está apenas por debajo de 1 TB. Realizando 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é el rm? antes de que causara estragos en mi directorio Dest/? Es rm realmente tan lento (¡afortunadamente!)?

Si no, ¿cómo rm ir sobre la eliminación recursiva de las 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 lo que potencialmente se fue volando.

Respuesta aceptada:

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

Este es exactamente el mismo método que usan otras aplicaciones para recorrer directorios recursivamente: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 en general 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 necesita 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 puedas confiar.

Relacionado:¿Optimización del tamaño del sector lógico para el tamaño del sector físico 4096 HDD?

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

Lo único en lo que puede confiar es que los argumentos se manejan en orden. Así que si C/ todavía estaba parcialmente allí, significaría que Dest/ estaba intacto. Si C/ se ha ido, puede hacerse una idea de dónde se han eliminado los archivos en Dest/ comprobando los tiempos de modificación del directorio y comparándolos con el tiempo C/ se eliminó o la hora en que finalizó la copia. El primer archivo a 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 pasó a través de un directorio o no.

La velocidad de rm es 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 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.


Linux
  1. Cómo averiguar qué hace un comando de Linux

  2. Que hace ?

  3. ¿Qué hace Echo $? ¿¿Hacer??

  4. ¿Cómo hago grep recursivamente?

  5. ¿Cómo determina el kernel de Linux el orden de las llamadas __init?

¿Qué es Hadoop Mapreduce y cómo funciona?

Comando de archivo de Linux:qué hace y cómo usarlo

¿Qué es Docker? ¿Como funciona?

¿Qué es el comando fuente en Linux y cómo funciona?

¿Cómo funciona un balanceador de carga? ¿Qué es el equilibrio de carga?

¿Cómo ver lo que hace el cliente DHCP?