¿Cuál es la diferencia entre los enlaces duros y los files copydos?

Tengo entendido que los enlaces duros incluyen una copy del file original y que podría eliminar un file vinculado en un directory, y aún existiría en el otro directory.

Si ese es el caso, ¿por qué querría usar enlaces duros? ¿Por qué no tener solo dos files separados?

Si copy un file, duplicará el contenido. Entonces, si modifica el contenido de un solo file, eso no tiene efecto sobre el otro.

Si hace un enlace permanente, creará un file que apunta al mismo contenido. Entonces, si cambia el contenido de cualquiera de los files, el cambio se verá en ambos.

Un enlace duro es básicamente un segundo nombre de file para el mismo file. Por lo tanto, si enlaza un file, solo estará una vez en el sistema de files y, por lo tanto, solo ocupará espacio una vez. Entonces, quiere usar esto si desea save el espacio de disco

En los filesystems de Unix, cada nombre de file es en realidad un enlace fijo a la location de los datos en el disco, llamado inodo. Si crea un nuevo enlace fijo a un file existente, no ocupará espacio adicional en el disco, ya que es solo otro puntero a los mismos datos. Si edita los datos por uno u otro enlace (o edita el inodo directamente) ambos files serán cambiados.

El sistema count el número de enlaces duros que tiene cada inodo. Cuando el número de enlaces es 0, ya no se puede acceder al file y los datos se marcan como seguros para sobrescribir. Por lo tanto, dado un file con 2 enlaces duros, si elimina cualquiera de los enlaces, los datos no se eliminarán. Solo si elimina ambos, los datos desaparecerán.

Puede ver los numbers de inodo de los files que usan el -i al command ls .

Un enlace suave, por otro lado, apunta a otro file por su nombre de file. Si mueve o elimina el file original, el enlace se romperá.

Con reference a la parte de la pregunta que preguntaba "¿por qué querría usar enlaces duros?":

Los files vinculados (o para los enlaces blandos (simbólicos) ofrecen una forma útil de tener un solo file ejecutable que se puede enmascarar para diferentes propósitos.

Es decir, el nombre por el cual se invoca el código puede examinarse para determinar qué opciones están disponibles para su ejecución. Esto permite el desarrollo y el empaquetado de una gran pieza de código con toda la funcionalidad compartida necesaria para fines ligeramente diferentes. Desde la perspectiva del usuario, la especificación de "qué" ejecutar (por nombre) limita las opciones y la presentación a un subset de opciones más manejable.

Un ejemplo clásico es LVM. Hubo un time en que HP-UX utilizaba files vinculados para varios ejecutables (por ejemplo, vgdisplay , vgcreate , vgextend , etc. Hoy, como Linux, estos commands son realmente enlaces simbólicos (suaves) al ejecutable lvm .