Na przykład mam plik myold_file
. Następnie używam ln
do utworzenia twardego linku jako mylink
:
ln myold_file mylink
Wtedy nawet używając ls -a
, nie wiem, który jest stary.
Czy jest coś do powiedzenia?
Na przykład mam plik myold_file
. Następnie używam ln
do utworzenia twardego linku jako mylink
:
ln myold_file mylink
Wtedy nawet używając ls -a
, nie wiem, który jest stary.
Czy jest coś do powiedzenia?
Odpowiedzi:
Nie możesz, ponieważ są one dosłownie tym samym plikiem, do którego prowadzą tylko różne ścieżki. Pierwszy nie ma specjalnego statusu.
.bashrc
jest plikiem zawierającym ...”, gdy mamy na myśli, „ścieżka względna .bashrc
odnosi się do pliku zawierającego ...”, jest to powszechne splot kategorii i powinniśmy rozumieć, że ilekroć się odnosi do ścieżka lub pozycja katalogu „będąca” plikiem, mamy na myśli plik, do którego się odnosi. Przy takim zrozumieniu dwa twarde łącza mogą „być” tym samym plikiem. Odrzucając tę konwencję na rzecz języka formalnego, nie mogą. Obie postawy mają swoje miejsce :-)
Nie ma na to bezpośredniego, czystego (niezawodnego) sposobu. Ale w odpowiednich okolicznościach może to być możliwe (lub przynajmniej prawdopodobne). Problem polega na tym, że istnieją dwa twarde łącza, ale tylko jeden plik. Zmiana, modyfikacja i (być może) czas tworzenia są przechowywane tylko dla plików (i-węzłów), ale nie dla pozycji katalogu (twardych linków). Tak więc potrzebne informacje można pobrać tylko z efektów wtórnych, które można łatwo zniszczyć za pomocą operacji niezwiązanych z plikiem. I nawet nie widać, czy został zniszczony. Możesz to wiedzieć tylko z okoliczności operacyjnych, jeśli dokładnie je znasz.
Utworzenie twardego łącza to operacja zapisu do katalogu zawierającego łącze. W ten sposób aktualizuje katalog mtime
. Więc jeśli
linki znajdują się w różnych katalogach
i wiesz, że żaden z tych katalogów nie został zmieniony (plik dodany, usunięty, przemianowany lub zmiana metadanych pliku) po utworzeniu drugiego twardego łącza, możesz po prostu porównać mtime
s katalogów.
Przypadek szczególny: jeśli jeden z katalogów ma mtime
przed plikiem (i-węzeł) mtime
i możesz mieć pewność, że plik nie został zapisany później niż chwilę po jego utworzeniu, wówczas link do tego katalogu jest starszy.
Jeśli linki znajdują się w tym samym katalogu (wydaje się, że tak jest w twoim pytaniu), to staje się gorzej. Następnie możesz użyć
ls -lU
aby uzyskać wrażenie kolejności, w jakiej wpisy zostały utworzone. Nie musi to być poprawna kolejność, ponieważ wpisy można usuwać, aby nowe wpisy były wprowadzane na środku listy katalogów. I, jak zauważył Gilles, nie działa wcale z nowszymi systemami plików.
ls -lU
sztuczka nie działa na nowoczesnych systemach plików (ext4, btrfs, zfs), tam wpisy nie pojawiają się wcale w kolejności tworzenia.
rm myold_file
wtedy mylink
nadal istnieje i działa idealnie, gdyż jest równie dobry wpis odnoszący się do tego samego węzła bazowego. Tylko wtedy, gdy oba zostaną usunięte, system może odrzucić i-węzeł. Po zastosowaniu twardego połączenia do utworzenia dwóch wpisów w systemie plików odnoszących się do tego samego pliku, są one równoważne. (Zauważ, że „plik” oznacza tutaj „i-węzeł przechowujący dane dla pliku, w przeciwieństwie do katalogu). Patrz: pl.wikipedia.org/wiki/Inode
Jeśli polegasz na czasie ostatniej modyfikacji katalogów i nie masz wiedzy o tym, jak i kiedy te katalogi są zmieniane, poleganie na mtime doprowadzi cię do pomyłki przez pewien czas. Problem polega na tym, że plik jest reprezentowany w systemie plików przez i-węzeł, a nie pozycję katalogu. Wpis katalogu (nazwa pliku) wskazuje i-węzeł, a nie plik.
Wydaje mi się, że przyglądałbym się pępkowi, dlaczego muszę wiedzieć, która pozycja katalogu jest starsza i jak tego uniknąć.
Myślę, że to pytanie jest (dość rozsądnie) mylone co do tego, czym tak naprawdę jest twardy link. Myślę jednak, że najbardziej poprawną bezpośrednią odpowiedzią jest „oboje są” .
Unixowe systemy plików zwykle przechowują rzeczywistą zawartość pliku i dane w i-węzłach, nie mają one żadnej ścieżki, ścieżki mają wtedy relację wiele do jednego z tymi i-węzłami. Weźmy za analogię osobę o dwóch imionach, Bob i Joe. Nie można powiedzieć, że Bob jest starszy od Joe i odwrotnie, to tylko imiona dla tej samej osoby.
Jeśli chcesz zachować koncepcję „oryginalnego” pliku i nowego, prawdopodobnie zamiast tego poszukujesz dowiązania symbolicznego, są one raczej aliasem, tylko instrukcją dla systemu operacyjnego, że powinien on działać na jedną ścieżkę tak, jakby były inne bez zmiany struktury pliku poniżej. (możesz to zrobić za pomocą „linku do pliku ln -s”.
Sedno odpowiedzi udzielonej przez kilka innych powyżej jest takie, że każda nazwa pliku jest twardym linkiem do pliku. Nie ma prawdziwego oryginału, może tylko pierwszy.
Pomyśl o katalogu jak o tabeli, która zawiera nazwy plików i numery i-węzłów.
Każde twarde łącze, w tym pierwsze, jest wpisem w katalogu, który przypisuje „nazwę pliku” do numeru i-węzła, abyś mógł uzyskać dostęp do pliku o tej nazwie.
Plik jest zbiorem bloków na dysku, zarządzanych i śledzonych przez metadane przechowywane w i-węzle. Plik ma jeden numer i-węzła.
Dostęp do danych pliku za pomocą nazwy pliku jest procesem trzyetapowym: Nazwa pliku jest sprawdzana w katalogu w celu uzyskania numeru i-węzła. Następnie określa się i-węzeł w celu znalezienia odpowiedniego bloku dysku (lub bloków) zawierającego dane. Następnie te bloki są odczytywane / zapisywane.
Podsumowując, wszystko to w zasadzie: nie ma absolutnie żadnej różnicy między dostępem do zawartości pliku za pomocą pierwszego („oryginalnego”) lub później utworzonych twardych linków.
ls > a; ln a b; rm a; ln b c
, który z nich jest „bardziej oryginalny” niż drugi?a
nie ma, pozostaje cib
ic
...