Cómo saber qué archivo es original si se crea un enlace duro


34

Por ejemplo, tengo un archivo myold_file. Luego uso lnpara crear un enlace duro como mylink:

ln myold_file mylink

Entonces, incluso usando ls -a, no puedo decir cuál es el viejo.

¿Hay alguna manera de decirlo?


2
Contraataque: si lo hace ls > a; ln a b; rm a; ln b c, ¿cuál es "más original" que el otro? ase ha ido, te quedan by c...
glglgl 02 de

2
¿Qué estás intentando lograr? ¿Qué estás intentando lograr? No hay "original" como tal. Un archivo es un inodo que contiene metadatos y una colección de bloques que contienen datos. Un directorio puede contener un enlace al archivo, y este enlace es el nombre del archivo y el número de inodo. Puede crear cualquier número de enlaces a un archivo. Los archivos nunca pueden tener menos de un enlace.
Johan

Para una explicación detallada de la respuesta aceptada de esta pregunta: Vea la respuesta aceptada de esa pregunta .
Utku

Respuestas:


93

No puede, porque son literalmente el mismo archivo, solo alcanzado por diferentes rutas. El primero no tiene un estado especial.


44
Esta es claramente la respuesta correcta: la pregunta del OP se basa en un malentendido.
Daniel Earwicker

8
@Adnan En realidad, no: los dos enlaces duros son el mismo archivo. Son entradas de directorio diferentes. La terminología de Jenny D es correcta.
Gilles 'SO- deja de ser malvado'

1
@Gilles No veo cómo puede ser correcto. Dos enlaces duros no son dos archivos ; Los enlaces duros no son archivos. Ellos señalan , por lo tanto, vincular , en el mismo archivo (que es la ubicación física en el disco). Decir que "dos enlaces duros son literalmente el mismo archivo" está mal.
Adi

1
@JennyD Y esa es la única forma en que escuché que se usaba el "enlace duro"; un puntero del sistema de archivos a un inodo. Bueno, supongo que todos estamos equivocados y correctos. Dejaré de discutir esto porque no tiene sentido. Tu respuesta me parece correcta, tienes un +1 de mí y lo dejaré así.
Adi

55
Decir que un enlace duro "es" un archivo es comparar cosas de diferentes categorías, lo que es técnicamente incorrecto. Pero dado que generalmente decimos, " .bashrces un archivo que contiene ..." cuando queremos decir, "la ruta relativa se .bashrcrefiere a un archivo que contiene ...", esta es una combinación común de categorías y debemos entender que siempre que uno se refiere a una ruta o una entrada de directorio "siendo" un archivo, nos referimos al archivo al que se refiere. Con ese entendimiento, dos enlaces duros pueden "ser" el mismo archivo. Rechazando esa convención a favor del lenguaje formal, no pueden. Ambas posturas tienen su lugar :-)
Steve Jessop

16

No hay una forma directa, limpia (confiable) de hacerlo. Pero en circunstancias apropiadas esto puede ser posible (o al menos probable). El problema es que hay dos enlaces duros pero solo un archivo. El tiempo de cambio, modificación y (tal vez) creación se almacena solo para archivos (inodos) pero no para entradas de directorio (los enlaces duros). Por lo tanto, la información que desea puede tomarse solo de efectos secundarios que pueden destruirse fácilmente mediante operaciones que no están relacionadas con el archivo. Y ni siquiera puedes ver si ha sido destruido. Solo puede saberlo por las circunstancias operativas si es consciente de ellas.

La creación de un enlace duro es una operación de escritura en el directorio que contiene el enlace. Por lo tanto, actualiza el directorio mtime. Entonces si

  1. los enlaces están en diferentes directorios

  2. y sabe que ninguno de estos directorios ha cambiado (archivo agregado, eliminado, renombrado o cambio de metadatos de archivo) después de que se haya creado el segundo enlace rígido, simplemente puede comparar los correos mtimeelectrónicos de los directorios.

Caso especial: si uno de los directorios tiene un mtimeantes del archivo (inodo) mtimey puede estar razonablemente seguro de que el archivo no se ha escrito después de un breve momento después de su creación, el enlace de este directorio es el anterior.

Si los enlaces están en el mismo directorio (que parece ser el caso en su pregunta), entonces empeora. Entonces puedes usar

ls -lU

para tener una idea del orden en que se crearon las entradas. Ese no tiene que ser el orden correcto, ya que las entradas se pueden eliminar para que las nuevas entradas se realicen en el medio de la lista del directorio. Y como Gilles señaló, no funciona en absoluto con los sistemas de archivos más nuevos.


2
¿Ninguna mención de selinux, pistas de auditoría o espionaje en el diario del sistema de archivos? la sonrisa boba Sin una pista de auditoría, no hay manera de saber - todo lo demás es una calculada conjetura
Ricky haz

1
@mikeserv Si quieres enseñar a otros de esta manera, al menos deberías aprender a citar correctamente. No , no decir "qué archivo" en la pregunta. E incluso si lo hiciera, entonces esto sería solo un problema de redacción y arrojar algo de cerebro para comprender la pregunta revelaría fácilmente de qué se trata realmente.
Hauke ​​Laging

44
El truco del directorio mtime funcionará si las circunstancias son correctas (lo cual es raro). Sin embargo, en la forma en que lo presentas, a veces llegarás a la conclusión opuesta. El directorio mtime es solo una indicación que vale la pena si es igual al ctime del archivo. Pero el ls -lUtruco no funcionará en los sistemas de archivos modernos (ext4, btrfs, zfs), allí las entradas no se muestran en orden de creación.
Gilles 'SO- deja de ser malvado'

2
@mikeserv: la pregunta del OP se basa en un malentendido. Si lo hicieran rm myold_fileentonces mylinksería todavía existen y funcionan a la perfección, ya que es igualmente buena entrada que haga referencia al mismo inodo subyacente. Solo cuando ambos se hayan eliminado, el sistema puede descartar el inodo. Una vez que se ha utilizado el enlace duro para crear dos entradas del sistema de archivos que se refieren al mismo archivo, son equivalentes. (Tenga en cuenta que "archivo" aquí significa "un inodo que contiene los datos de un archivo, en lugar de un directorio). Ver: en.wikipedia.org/wiki/Inode
Daniel Earwicker

1
-1 porque, aunque la información sobre cómo cambia el directorio en algunos sistemas de archivos al actualizar las tablas, esta respuesta no aclara la falta de comprensión presente en la pregunta de que "archivo original" no es una propiedad en el caso de múltiples enlaces duros a un solo inodo. En ese sentido, si bien es anecdóticamente interesante, no es lo que la mayoría de las personas que llegan a esta pregunta deberían aprender sobre el concepto fundamental de los enlaces duros. Este problema no es la falta de una "forma directa y limpia de hacerlo", el problema es que no existe "eso" en primer lugar.
Caleb

10

Si confía en el tiempo de última modificación de los directorios y no tiene conocimiento de cómo y cuándo se cambian esos directorios, confiar en mtime lo llevará a equivocarse un porcentaje del tiempo. El problema aquí es que el archivo está representado en el sistema de archivos por un inodo, no por una entrada de directorio. La entrada del directorio (nombre de archivo) apunta al inodo, no al archivo.

Creo que estaría estudiando el ombligo sobre por qué necesito saber qué entrada de directorio es más antigua y cómo evitar tener que saber eso.


8

Creo que esta pregunta es (bastante razonable) equivocada en cuanto a qué es realmente un enlace duro. Sin embargo, creo que la respuesta directa más correcta es 'Ambos son' .

Los sistemas de archivos Unix normalmente almacenan contenidos y datos de archivos reales en nodos i, estos no tienen una ruta de ningún tipo, las rutas tienen una relación de muchos a uno con estos nodos i. Tomemos como analogía a una persona que tiene dos nombres, Bob y Joe. No se podría decir que Bob es mayor que Joe o viceversa, solo son nombres para la misma persona.

Si desea conservar el concepto de un archivo 'original' y uno nuevo, es probable que esté buscando un enlace simbólico, estos son más un alias, solo una instrucción para el sistema operativo de que debe operar en una ruta como si fueron a otro sin cambiar la estructura de archivos debajo. (puede hacer esto con "enlace de archivo ln -s".


Sabes, Bob / Joe puede volverse muy sensible sobre su edad ... La comparación de enlaces duros / blandos es buena, especialmente cuando consideras que un enlace duro solo obtendrá una entrada agregada en un archivo de directorio, un ya existente inodo, pero un enlace suave es un archivo en sí mismo y, por lo tanto, se le asigna su propio inodo. Aún así, en ambos casos, el tiempo de modificación solo es relevante para el archivo vinculado, ya que las únicas modificaciones que se pueden hacer a un enlace de cualquier importancia serían simplemente la creación / eliminación.
mikeserv

2

El quid de la respuesta dada por varios otros arriba es que cada nombre de archivo es un enlace duro a un archivo. No hay un original real, solo posiblemente uno primero.

Piense en un directorio como una tabla que enumera nombres de archivos y números de inodo.

Cada enlace duro, incluido el primero, es una entrada en un directorio que asigna un "nombre de archivo" al número de inodo, para que pueda acceder al archivo con ese nombre.

El archivo es una colección de bloques en disco, gestionados y rastreados por metadatos almacenados en un inodo. Un archivo tiene un número de inodo.

El acceso a los datos de un archivo a través del nombre del archivo es un proceso de tres pasos: el nombre del archivo se busca en el directorio para obtener el número de inodo. Luego se hace referencia al inodo para encontrar el bloque (o bloques) de disco relevante que contiene los datos. Luego, finalmente, esos bloques se leen / escriben.

Entonces, la conclusión de todo lo que es básicamente esto es: no hay absolutamente ninguna diferencia entre acceder al contenido del archivo usando el primer ("original") o cualquier enlace duro creado posteriormente.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.