Come dire quale file è originale se viene creato l'hard link


34

Ad esempio, ho un file myold_file. Quindi uso lnper creare un collegamento reale come mylink:

ln myold_file mylink

Quindi, anche usando ls -a, non posso dire quale sia il vecchio.

C'è qualcosa da dire?


2
Controquestione: se lo fai ls > a; ln a b; rm a; ln b c, quale è "più originale" dell'altro? ase ne è andato, ti rimane con be c...
glglgl

2
Cosa stai cercando di ottenere? Cosa stai cercando di ottenere? Non esiste un "originale" in quanto tale. Un file è un inode contenente metadati e una raccolta di blocchi contenenti dati. Una directory può contenere un collegamento al file e questo collegamento è il nome del file e il numero dell'inode. È possibile creare un numero qualsiasi di collegamenti a un file. I file non possono mai avere meno di un collegamento.
Johan

Per una spiegazione dettagliata della risposta accettata a questa domanda: vedere la risposta accettata a tale domanda .
Utku,

Risposte:


93

Non puoi, perché sono letteralmente lo stesso file, raggiunto solo da percorsi diversi. Il primo non ha uno status speciale.


4
Questa è chiaramente la risposta giusta: la domanda del PO si basa su un malinteso.
Daniel Earwicker,

8
@Adnan In realtà no: i due hard link sono lo stesso file. Sono voci di directory diverse. La terminologia di Jenny D è corretta.
Gilles 'SO-smetti di essere malvagio' il

1
@Gilles Non vedo come possa essere corretto. Due hard link non sono due file ; i collegamenti reali non sono file. Essi sottolineano , quindi collegare , per lo stesso file (che è la posizione fisica sul disco). Dire che "due hard link sono letteralmente lo stesso file" è sbagliato.
Adi,

1
@JennyD E questo è praticamente l'unico modo in cui ho sentito l'uso di "hard link"; un puntatore del filesystem a un inode. Beh, immagino che abbiamo tutti torto e ragione. Smetterò di discuterne perché è inutile. La tua risposta mi sembra corretta, hai un +1 da parte mia e lo lascerò a quello.
Adi,

5
Dire che un hard link "è" un file sta confrontando cose di diverse categorie, il che è tecnicamente errato. Ma dato che in genere diciamo " .bashrcè un file contenente ..." quando intendiamo "il percorso relativo si .bashrcriferisce a un file contenente ...", questa è una comune fusione di categorie e dovremmo capire che ogni volta che ci si riferisce a un percorso o una voce della directory "essendo" un file, intendiamo il file a cui si riferisce. Con questa comprensione, due hard link possono "essere" lo stesso file. Rifiutando quella convenzione a favore del linguaggio formale, non possono. Entrambe le posizioni hanno il loro posto :-)
Steve Jessop

16

Non esiste un modo diretto, pulito (affidabile) per farlo. Ma in circostanze appropriate ciò può essere possibile (o almeno probabile). Il problema è che ci sono due hard link ma solo un file. Il tempo di cambiamento, modifica e (forse) creazione sono memorizzati solo per i file (inode) ma non per le voci della directory (i collegamenti reali). Pertanto, le informazioni desiderate possono essere ricavate solo da effetti secondari che possono essere facilmente distrutti da operazioni che non sono correlate al file. E non puoi nemmeno vedere se è stato distrutto. Puoi saperlo solo dalle circostanze operative se ne sei consapevole.

La creazione di un collegamento reale è un'operazione di scrittura nella directory che contiene il collegamento. Quindi aggiorna la directory mtime. Quindi se

  1. i collegamenti sono in diverse directory

  2. e sai che nessuna di queste directory è stata cambiata (file aggiunto, cancellato, rinominato o modifica dei metadati del file) dopo che è stato creato il secondo hard link, puoi semplicemente confrontare le mtimes delle directory.

Caso particolare: se una delle directory ha una mtimeprima del file (inode) mtimee si può essere ragionevolmente sicuri che il file non sia stato scritto dopo un breve istante dopo la sua creazione, il collegamento di questa directory è quello più vecchio.

Se i collegamenti si trovano nella stessa directory (che sembra essere il caso nella tua domanda), allora peggiora. Quindi puoi usare

ls -lU

per avere un'idea dell'ordine in cui sono state create le voci. Non è necessario che sia l'ordine corretto poiché le voci possono essere eliminate in modo da creare nuove voci nel mezzo dell'elenco delle directory. E come ha sottolineato Gilles, non funziona affatto con i filesystem più recenti.


2
Nessuna menzione di selinux, audit trail o spionaggio sul journal del filesystem ??? sorride Senza una pista di controllo, non c'è modo di sapere - qualsiasi altra cosa è un'ipotesi
Ricky Beam

1
@mikeserv Se vuoi insegnare agli altri in questo modo, dovresti almeno imparare a citare correttamente. Essa non dire "quale file" nella questione. E anche se lo facesse, questo sarebbe solo un problema di formulazione e dare un po 'di cervello alla comprensione della domanda rivelerebbe facilmente di cosa si tratta davvero.
Hauke ​​Laging,

4
Il trucco della directory mtime funzionerà se le circostanze sono giuste (il che è raro). Tuttavia, nel modo in cui lo stai presentando, a volte giungerai alla conclusione opposta. La directory mtime è solo un'indicazione utile se è uguale al ctime del file. Ma il ls -lUtrucco non funzionerà sui moderni filesystem (ext4, btrfs, zfs), le voci non vengono visualizzate nell'ordine di creazione.
Gilles 'SO-smetti di essere malvagio'

2
@mikeserv: la domanda del PO si basa su un malinteso. Se facessero rm myold_fileallora mylinksarebbe ancora esistono e funzionano perfettamente, in quanto è un altrettanto buona entrata riferendosi allo stesso inode sottostante. Solo quando entrambi sono stati eliminati il ​​sistema può scartare l'inode. Una volta che l'hard linking è stato utilizzato per creare due voci del file system che fanno riferimento allo stesso file, sono equivalenti. (Nota che "file" qui significa "un inode che contiene i dati per un file, al contrario di una directory. Vedi: en.wikipedia.org/wiki/Inode
Daniel Earwicker

1
-1 perché, sebbene le informazioni su come la directory cambia in alcuni file system durante l'aggiornamento delle tabelle, questa risposta non chiarisce la mancanza di comprensione presente nella domanda che "file originale" non è una proprietà nel caso di più collegamenti fissi a un singolo inode. In questo senso, mentre è aneddoticamente interessante, non è quello che la maggior parte delle persone che affrontano questa domanda dovrebbero conoscere il concetto fondamentale di hardlink. Questo problema non è la mancanza di un "modo pulito diretto per farlo", il problema è che non c'è "esso" in primo luogo.
Caleb,

10

Se si fa affidamento sull'ultimo tempo di modifica delle directory e non si è a conoscenza di come e quando tali directory vengono modificate, fare affidamento su mtime ti porterà a sbagliare una percentuale del tempo. Il problema qui è che il file è rappresentato nel filesystem da un inode, non da una voce della directory. La voce della directory (nome file) punta all'inode, non al file.

Penso che starei guardando l'ombelico sul perché ho bisogno di sapere quale voce della directory è più vecchia e come evitare di aver bisogno di saperlo.


8

Penso che questa domanda sia (ragionevolmente) fuorviante su cosa sia davvero un collegamento reale. Penso tuttavia che la risposta diretta più corretta sia "Entrambi sono" .

I file system Unix normalmente archiviano i contenuti e i dati dei file effettivi nei nodi i, questi non hanno alcun percorso, quindi i percorsi hanno una relazione molti a uno con questi i-nodi. Prendi per analogia una persona che ha due nomi, Bob e Joe. Non si può dire che Bob sia più vecchio di Joe o viceversa, sono solo nomi per la stessa persona.

Se vuoi conservare il concetto di un file "originale" e di uno nuovo, probabilmente stai cercando un collegamento simbolico, questi sono più un alias, solo un'istruzione per il sistema operativo che dovrebbe operare su un percorso come se eravamo su un altro senza cambiare la struttura del file sottostante. (puoi farlo con "ln -s file link".


Sai, Bob / Joe può diventare molto sensibile alla sua età ... Il confronto hard / soft link è buono - specialmente se si considera che un hard link otterrà semplicemente una voce aggiunta in un file di directory - un già esistente inode - ma un soft-link è un file a sé stante e gli viene quindi assegnato un proprio inode. Tuttavia, in entrambi i casi, il tempo di modifica è rilevante solo per il file collegato, in quanto le uniche modifiche che possono essere apportate a un collegamento di qualsiasi significato sarebbero solo la creazione / eliminazione.
Mikeserv,

2

Il punto cruciale della risposta data da molti altri sopra è che il nome di ogni file è un collegamento reale a un file. Non esiste un vero originale, forse solo il primo.

Pensa a una directory come a una tabella che elenca nomi di file e numeri di inode.

Ogni collegamento reale, incluso il primo, è una voce in una directory che assegna un "nome file" al numero di inode, in modo da poter accedere al file con quel nome.

Il file è una raccolta di blocchi su disco, gestita e tracciata da metadati memorizzati in un inode. Un file ha un numero di inode.

L'accesso ai dati di un file tramite il nome del file è un processo in tre fasi: il nome del file viene cercato nella directory per ottenere il numero di inode. Si fa quindi riferimento all'inode per trovare il blocco (o i blocchi) del disco rilevante contenente i dati. Quindi finalmente quei blocchi vengono letti / scritti.

Quindi il risultato da tutto ciò è fondamentalmente questo: non vi è assolutamente alcuna differenza tra l'accesso al contenuto del file utilizzando il primo ("originale") o qualsiasi collegamento reale creato successivamente.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.