Jak stwierdzić, który plik jest oryginalny, jeśli utworzono łącze twarde


34

Na przykład mam plik myold_file. Następnie używam lndo 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?


2
Przeciwdziałanie: Jeśli tak ls > a; ln a b; rm a; ln b c, który z nich jest „bardziej oryginalny” niż drugi? anie ma, pozostaje ci bi c...
glglgl

2
Co próbujesz osiągnąć? Co próbujesz osiągnąć? Nie ma „oryginału” jako takiego. Plik to i-węzeł zawierający metadane i zbiór bloków zawierających dane. Katalog może zawierać link do pliku, który to nazwa pliku i numer i-węzła. Możesz utworzyć dowolną liczbę linków do pliku. Pliki nigdy nie mogą zawierać mniej niż jednego łącza.
Johan

Szczegółowe wyjaśnienie przyjętej odpowiedzi na to pytanie: Zobacz zaakceptowaną odpowiedź na to pytanie .
Utku

Odpowiedzi:


93

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.


4
To jest oczywiście właściwa odpowiedź: pytanie PO opiera się na nieporozumieniu.
Daniel Earwicker

8
@Adnan Właściwie nie: dwa twarde łącza to ten sam plik. Są to różne wpisy katalogu. Terminologia Jenny D. jest poprawna.
Gilles „SO- przestań być zły”

1
@Gilles Nie wiem, jak to może być poprawne. Dwa twarde łącza nie są dwoma plikami ; twarde linki nie są plikami. Oni wskazują , dlatego odwołuje się do tego samego pliku (co jest fizyczne miejsce na dysku). Mówienie, że „dwa twarde linki są dosłownie tym samym plikiem” jest błędne.
Adi

1
@JennyD I to właściwie jedyny sposób, w jaki usłyszałem użycie „twardego linku”; wskaźnik systemu plików do i-węzła. Cóż, chyba wszyscy się mylimy i mamy rację. Przestanę argumentować, ponieważ jest to bezcelowe. Twoja odpowiedź wydaje mi się poprawna, masz ode mnie +1, a ja na tym zostawię.
Adi

5
Mówiąc, że twardy link „to” plik porównuje rzeczy różnych kategorii, co jest technicznie niepoprawne. Ale biorąc pod uwagę, że ogólnie mówimy „ .bashrcjest plikiem zawierającym ...”, gdy mamy na myśli, „ścieżka względna .bashrcodnosi 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 :-)
Steve Jessop

16

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

  1. linki znajdują się w różnych katalogach

  2. 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ć mtimes katalogów.

Przypadek szczególny: jeśli jeden z katalogów ma mtimeprzed plikiem (i-węzeł) mtimei 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.


2
Brak wzmianki o selinux, ścieżkach audytu lub szpiegowaniu w dzienniku systemu plików ??? uśmieszek Bez ścieżki audytu nie ma sposobu, aby wiedzieć - wszystko inne jest zgadywanką
Ricky Beam

1
@ mikeserv Jeśli chcesz uczyć innych w ten sposób, powinieneś przynajmniej nauczyć się poprawnie cytować. W pytaniu nie jest napisane „który plik”. I nawet gdyby tak się stało, byłby to tylko problem z sformułowaniem, a rzucenie mózgu na zrozumienie pytania z łatwością ujawniłoby, o co tak naprawdę jest.
Hauke ​​Laging

4
Sztuczka mtime katalogu zadziała, jeśli okoliczności będą odpowiednie (co jest rzadkie). Jednak sposób, w jaki go prezentujesz, czasami dochodzi do przeciwnego wniosku. Katalog mtime jest wartościowym wskazaniem tylko wtedy, gdy jest równy ctime pliku. Ale ls -lUsztuczka nie działa na nowoczesnych systemach plików (ext4, btrfs, zfs), tam wpisy nie pojawiają się wcale w kolejności tworzenia.
Gilles „SO- przestań być zły”

2
@mikeserv - pytanie OP opiera się na nieporozumieniu. Gdyby tak było rm myold_filewtedy mylinknadal 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
Daniel Earwicker

1
-1 ponieważ chociaż informacje o tym, jak zmienia się katalog w niektórych systemach plików podczas aktualizacji tabel, ta odpowiedź nie wyjaśnia braku zrozumienia obecnego w pytaniu, że „oryginalny plik” nie jest właściwością w przypadku wielu dowiązań twardych do pojedynczego i-węzła. W tym sensie, choć jest to anegdotycznie interesujące, nie jest to, czego większość ludzi, którzy padają na to pytanie, powinna dowiedzieć się o podstawowej koncepcji linków twardych. Problemem tym nie jest brak „bezpośredniego, czystego sposobu na zrobienie tego”. Problem polega na tym, że w ogóle nie ma „tego” .
Caleb

10

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ąć.


8

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”.


Wiesz, Bob / Joe może naprawdę bardzo wczuć się w swój wiek ... Porównanie linków twardych / miękkich jest dobre - zwłaszcza jeśli weźmie się pod uwagę, że linku twardego zostanie dodany wpis do pliku katalogu - już istnieje i-węzeł - ale soft-link jest plikiem sam w sobie i dlatego jest przypisany do własnego i-węzła. Jednak w obu przypadkach czas modyfikacji jest istotny tylko dla połączonego pliku, ponieważ jedynymi modyfikacjami, które można wprowadzić do łącza o dowolnym znaczeniu, byłyby tylko tworzenie / usuwanie.
mikeserv

2

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.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.