¿Hay algún orden de operaciones para rm
? Realicé rm
en un directorio grande y tengo curiosidad sobre dónde debería mirar para ver qué podría haber sido eliminado. ¿ rm
Funciona 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 time
comando 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 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 es así, ¿cómo se realiza la rm
eliminació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ó.
Respuestas:
rm -r
trabaja en cada uno de sus argumentos a su vez. Si un argumento es un directorio, enumera el directorio (con las funcionesopendir
yreaddir
o 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
ls
oecho *
ordenar los archivos en orden lexicográfico de sus nombres.find
yls -f
no 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 queDest/
no se había tocado. SiC/
desapareció, puede tener una idea de dónde se han eliminado los archivosDest/
al verificar los tiempos de modificación del directorio y compararlos con el momento en queC/
se eliminó o el momento en que finalizó la copia. El primer archivo que se eliminará podría ser un archivo directamente dentroDest/
o en algún lugar profundo de la jerarquía, dependiendo de si la primera entradaDest/
querm
sucedió en el recorrido fue 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 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.fuente
-f
opción dels
está documentada como equivalente a-aU
, donde-a
significa listar todos los archivos y-U
medios sin clasificar. Recuerdo vagamente encontrar una versión de lals
cual-f
no funcionó (creo que se definió como otra cosa) pero-aU
sí.-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.-U
porque solo sin clasificar es una característica de GNU, no creo que exista en ningún otro lugar.ls -U
en un directorio. Este es el mismo orden querm -r
funcionaría en ese directorio. Tenga en cuenta que agregar o eliminar un archivo puede cambiar el orden de los otros archivos.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?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.
fuente