Por ejemplo, tengo un archivo myold_file
. Luego uso ln
para 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?
filesystems
hard-link
BufBills
fuente
fuente
ls > a; ln a b; rm a; ln b c
, ¿cuál es "más original" que el otro?a
se ha ido, te quedanb
yc
...Respuestas:
No puede, porque son literalmente el mismo archivo, solo alcanzado por diferentes rutas. El primero no tiene un estado especial.
fuente
.bashrc
es un archivo que contiene ..." cuando queremos decir, "la ruta relativa se.bashrc
refiere 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 :-)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 silos enlaces están en diferentes directorios
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
mtime
electrónicos de los directorios.Caso especial: si uno de los directorios tiene un
mtime
antes del archivo (inodo)mtime
y 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
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.
fuente
ls -lU
truco no funcionará en los sistemas de archivos modernos (ext4, btrfs, zfs), allí las entradas no se muestran en orden de creación.rm myold_file
entoncesmylink
serí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/InodeSi 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.
fuente
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".
fuente
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.
fuente