Наприклад, у мене є файл myold_file
. Потім я використовую ln
для створення жорсткого посилання як mylink
:
ln myold_file mylink
Тоді, навіть використовуючи ls -a
, я не можу сказати, що є старим.
Чи все-таки можна сказати?
Наприклад, у мене є файл myold_file
. Потім я використовую ln
для створення жорсткого посилання як mylink
:
ln myold_file mylink
Тоді, навіть використовуючи ls -a
, я не можу сказати, що є старим.
Чи все-таки можна сказати?
Відповіді:
Ви не можете, оскільки вони є буквально одним і тим же файлом, до якого дістаються лише різні шляхи. Перший не має особливого статусу.
.bashrc
це файл, що містить ...", коли ми маємо на увазі, "відносний шлях .bashrc
відноситься до файлу, що містить ...", це звичайне співвідношення категорій, і ми повинні розуміти, що коли б посилався на шлях або запис каталогу "будучи" файлом, ми маємо на увазі файл, на який він посилається. З огляду на це розуміння, два важких посилання можуть "бути" одним файлом. Відкидаючи цю конвенцію на користь формальної мови, вони не можуть. Обидві позиції мають своє місце :-)
Не існує прямого, чистого (надійного) способу зробити це. Але за відповідних обставин це може бути можливим (або принаймні ймовірним). Проблема полягає в тому, що є два жорстких посилання, але лише один файл. Зміна, модифікація та (можливо) час створення зберігаються лише для файлів (inodes), але не для записів каталогів (жорсткі посилання). Таким чином, потрібна інформація може бути взята лише з вторинних ефектів, які можуть бути легко знищені операціями, не пов'язаними з файлом. І ви навіть не можете побачити, чи воно було знищене. Це ви можете дізнатись лише з експлуатаційних обставин, якщо ви точно їх знаєте.
Створення жорсткого посилання - це операція запису в каталог, який містить посилання. Таким чином, він оновлює каталоги mtime
. Так що якщо
посилання є в різних каталогах
і ви знаєте, що жоден із цих каталогів не змінено (файл додано, видалено, перейменовано або змінено метадані файлів) після створення другого жорсткого посилання, тоді ви можете просто порівняти mtime
s каталогів.
Особливий випадок: Якщо в одному з каталогів є mtime
файл до (inode), mtime
і ви можете бути впевнені, що файл був записаний не пізніше, ніж через короткий момент після його створення, тоді посилання цього каталогу є старшим.
Якщо посилання знаходяться в одному каталозі (який, мабуть, має місце у вашому питанні), він стає гіршим. Тоді можна використовувати
ls -lU
щоб скласти враження про порядок створення записів. Це не повинен бути правильним порядком, оскільки записи можуть бути видалені, щоб нові записи були зроблені в середині списку каталогів. І як зазначив Жилл, він не працює зовсім з новими файловими системами.
ls -lU
хитрість не працюватиме в сучасних файлових системах (ext4, btrfs, zfs), там записи взагалі не відображаються в порядку створення.
rm myold_file
тоді, mylink
вони все одно існували б і працювали ідеально, оскільки це однаково хороший запис, що стосується тієї ж основної індеди. Тільки після видалення обох систем система може відкинути вклад. Після того, як жорстке посилання було використано для створення двох записів файлової системи, що посилаються на один і той же файл, вони є рівнозначними. (Зауважте, що тут "файл" означає "інода, що містить дані для файлу, на відміну від каталогу". Див.: En.wikipedia.org/wiki/Inode
Якщо ви покладаєтесь на час останньої модифікації каталогів, і не знаєте, як і коли ці каталоги змінюються, покладаючись на mtime, це призведе до того, що ви помилитесь деякий відсоток часу. Проблема тут полягає в тому, що файл представлений у файловій системі введенням, а не записом каталогу. Запис в каталозі (ім'я файлу) вказує на inode, а не на файл.
Думаю, я би заглянув на пуп, чому мені потрібно знати, який запис у каталозі є старшим і як уникнути необхідності цього знати.
Я думаю, що це питання (цілком обґрунтовано) хибне, що таке міцне посилання насправді. Я думаю, однак, найправильніша пряма відповідь - «Вони обоє є» .
Файлові системи Unix зазвичай зберігають фактичний вміст файлу та дані в i-вузлах, вони взагалі не мають шляху, тоді шляхи мають відношення до цих i-вузлів. Взяти за аналогію людину, яка йде за двома іменами, Боб і Джо. Не можна сказати, що Боб старший за Джо або навпаки, вони просто імена для однієї і тієї ж людини.
Якщо ви хочете зберегти концепцію "оригінального" файлу та нового, ви, швидше за все, шукаєте символічне посилання замість цього, це більше псевдонім, просто інструкція до ОС, що вона повинна діяти в один шлях, як ніби вони були до іншого, не змінюючи структуру файлу під ним. (їх можна зробити за допомогою "ln -s посилання на файл".
Суть відповіді, яку дають декілька інших вище, полягає в тому, що кожне ім'я файлу - це міцне посилання на файл. Немає справжнього оригіналу, просто можливо першого.
Подумайте про каталог як таблицю, в якій перераховані імена файлів та номери inode.
Кожне жорстке посилання, включаючи перше, - це запис у каталозі, який присвоює "ім'я файлу" номеру inode, щоб ви могли отримати доступ до файлу за цим ім'ям.
Файл - це сукупність блоків на диску, якими керуються та відстежуються метадані, що зберігаються в inode. У файлі є один номер inode.
Доступ до даних файлу через ім'я файлу - це три кроковий процес: ім'я файлу шукається в каталозі, щоб отримати номер inode. Потім посилається на inode, щоб знайти відповідний диск (або блоки), що містить дані. Потім нарешті ці блоки читаються / записуються.
Отже, вихід з дому з усього, що в основному є таким: Існує абсолютно ніяка різниця між доступом до вмісту файлів за допомогою першого ("оригіналу") або будь-яких створених згодом жорстких посилань.
ls > a; ln a b; rm a; ln b c
, який з них "оригінальніший", ніж інший?a
пішло, тобі залишилосьb
іc
...