Ad esempio, ho un file myold_file
. Quindi uso ln
per 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?
Ad esempio, ho un file myold_file
. Quindi uso ln
per 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?
Risposte:
Non puoi, perché sono letteralmente lo stesso file, raggiunto solo da percorsi diversi. Il primo non ha uno status speciale.
.bashrc
è un file contenente ..." quando intendiamo "il percorso relativo si .bashrc
riferisce 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 :-)
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
i collegamenti sono in diverse directory
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 mtime
s delle directory.
Caso particolare: se una delle directory ha una mtime
prima del file (inode) mtime
e 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.
ls -lU
trucco non funzionerà sui moderni filesystem (ext4, btrfs, zfs), le voci non vengono visualizzate nell'ordine di creazione.
rm myold_file
allora mylink
sarebbe 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
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.
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".
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.
ls > a; ln a b; rm a; ln b c
, quale è "più originale" dell'altro?a
se ne è andato, ti rimane conb
ec
...