¿Cuál es la diferencia entre unlink y rm?

Respuestas:

68

Ambos son un contenedor de la misma función fundamental que es una unlink()llamada al sistema.

Para sopesar las diferencias entre las utilidades de tierra de usuario.

rm(1):

  • Mas opciones.
  • Más comentarios
  • Comprobación de cordura.
  • Un poco más lento para llamadas individuales como resultado de lo anterior.
  • Se puede llamar con múltiples argumentos al mismo tiempo.

unlink(1):

  • Menos control de cordura.
  • No se pueden eliminar directorios.
  • Incapaz de recurrir.
  • Solo puede tomar un argumento a la vez.
  • Marginalmente más delgado para llamadas individuales debido a su simplicidad.
  • Más lento en comparación con dar rm(1)múltiples argumentos.

Podrías demostrar la diferencia con:

$ touch $(seq 1 100)
$ unlink $(seq 1 100)
unlink: extra operand `2'

$ touch $(seq 1 100)
$ time rm $(seq 1 100)

real    0m0.048s
user    0m0.004s
sys     0m0.008s

$ touch $(seq 1 100)
$ time for i in $(seq 1 100); do rm $i; done

real    0m0.207s
user    0m0.044s
sys     0m0.112s

$ touch $(seq 1 100)
$ time for i in $(seq 1 100); do unlink $i; done

real    0m0.167s
user    0m0.048s
sys     0m0.120s

Sin embargo, si estamos hablando de una llamada no adulterada a la unlink(2)función del sistema , de lo que ahora me doy cuenta es que probablemente no es lo que está contando.

Puede realizar un sistema unlink()en directorios y archivos por igual. Pero si el directorio es padre de otros directorios y archivos, entonces el enlace a ese padre se eliminaría, pero los hijos quedarían colgando. Lo cual es menos que ideal.

Editar:

Lo sentimos, aclaró la diferencia entre unlink(1)y unlink(2). La semántica seguirá siendo diferente entre plataformas.

Dan Carley
fuente
¿Significa eso que en los sistemas de archivos Unix eliminar un directorio y recursivamente todos los archivos debajo de él siempre será una operación proporcional al número de archivos / directorios que contiene? ¿Cuándo sucede cuando desvincula un directorio que es padre a otros directorios / archivos? ¿Nunca se borra y perdí este espacio para siempre?
Marcin
66
Es técnicamente posible dejar directorios / archivos huérfanos en la mayoría, si no en todos los sistemas de archivos. Solucionar esto generalmente significa ejecutar una herramienta de reparación del sistema de archivos. En Unix / Linux, estas herramientas se conocen como 'fsck' y algunas variaciones específicas para diferentes sistemas de archivos. Si recuperan algo, normalmente lo dejarán en un directorio llamado 'perdido + encontrado'
ConcernedOfTunbridgeWells
1
Correcto. rm recurrirá desde la parte inferior del árbol hacia arriba. Se puede demostrar cómo con: mkdir -p 1/2/3; touch 1/one 1/2/two 1/2/3/three; rm -ri 1. Si desvincula el directorio padre, entonces el espacio consumido por los hijos debería perderse hasta el momento en que fsck encuentre la discrepancia.
Dan Carley
1
¿De qué estás hablando? $ mkdir -p 1/2/3 $ unlink 1 unlink: no se puede desvincular `1 ': ¿Un directorio de usuarios que causa una pérdida de" memoria "requiere fsck? ¡Improbable!
Thomas
1
Las páginas de manual de Linux y FreeBSD indican explícitamente que fallará al intentar ejecutar unlink () en un directorio.
Thomas
8

En el nivel de especificación POSIX, lo que hace rm se especifica mucho más estrictamente que lo que hace unlink .

Es probable que la portabilidad del resultado sea mejor usando rm, si su script tiene que ejecutarse en los sistemas operativos.

Mike G.
fuente
4

La parte lenta de la eliminación es el código del sistema de archivos y el contenido del disco, no la preparación del espacio del usuario de la llamada al sistema unlink ().

Es decir: si la diferencia de velocidad es importante, entonces no debería almacenar los datos en el sistema de archivos.

unlink es solo una "luz" rm. rm tiene más funciones pero hacen lo mismo.

Thomas
fuente