Dowiązania twarde (hard links). Dowiązanie twarde to utworzenie nowej nazwy dla istniejącego pliku. Jeśli wyobrazimy sobie plik jako jego nazwę i dane na które ta nazwa wskazuje to można powiedzieć, że dowiązanie twarde to utworzenie nowej nazwy wskazującej na te same dane. Polecenie to jest podobne do kopiowania pliku z tym, że przy kopiowaniu tworzona jest niezależna kopia pliku a przy dowiązaniu twardym tworzona jest tylko nowa nazwa, która wskazuje na ten sam istniejący już plik. Do tworzenia dowiązań twardych służy polecenie ln. Używamy go następująco:
ln cel_dowiązania dowiązanie
gdzie:
cel_dowiązania - plik do którego chcemy zrobić dowiązanie
dowiązanie - plik, który będzie stanowił dowiązanie do pierwszego
Przykład. Weźmy pod uwagę plik "dorota" znajdujący się na pulpicie, którego ścieżka jest następująca: ~/Desktop/dorota. W moim przypadku jest to /home/sebastian/Desktop/dorota. (Znak "~" oznacza katalog domowy użytkownika). Na pulpicie znajduje się katalog "Katalog1" w którym chcemy zrobić dowiązanie do "dorota". Ścieżka do katalogu to ~/Desktop/Katalog1. Chcemy zrobic dowiązanie o nazwie "aneta". Wówczas cel dowiązania i dowiązanie będą następujące:
cel dowiązania - ~/Desktop/dorota
dowiązanie - ~/Desktop/Katalog1/aneta
Polecenie ln będzie wyglądało następująco:
$ ln ~/Desktop/dorota ~/Desktop/Katalog1/aneta
Polecenie to utworzy nam w katalogu "Katalog1" plik "aneta", który będzie dowiązaniem do pliku "dorota" znajdującego się na pulpicie (w katalogu ~/Desktop). W ten sposób nadaliśmy plikowi nową nazwę, która jest równoprawna ze starą. Oba pliki mają taką samą (wskazują na tą samą) zawartość.
Liczbę dowiązań do plików można sprawdzić wydając polecenie ls -l, które listuje zawartość katalogu podając kilka parametrów plików w nim zawartych. Jeśli wydamy to polecenie w katalogu "Katalog1" otrzymamy jeden wpis dotyczący pliku "aneta". U mnie wygląda on następująco:
$ ls -l
-rw-r--r-- 2 sebastian sebastian 12 cze 26 18:30 aneta
Pierwszy myślnik oznacza że jest to plik zwykły, pozostałe litery r,w i myślniki określają prawa dostępu do pliku. Cyfra 2 znajdująca się za nimi oznacza właśnie liczbę dowiązań. Pierwszym dowiązaniem jest nazwa ~/Desktop/dorota, drugim - ~/Desktop/Katalog1/aneta. Obie są równoprawne. Skasowanie jednej z nich nie kasuje zawartości pliku. Aby skasować plik należy skasować wszystkie dowiązania do niego. Plik zostaje skasowany w momencie skasowania ostatniego dowiązania twardego (nazwy). Jeżeli wylistujemy zawartość katalogu ~/Desktop otrzymamy analogiczny wpis z nazwą dorota, który też pokaże liczbę dowiązań 2.
Skasujmy teraz jedną nazwę np: rm ~/Desktop/dorota
Listujemy ponownie katalog "Katalog1":
$ ls -l
-rw-r--r-- 1 sebastian sebastian 12 cze 26 18:30 aneta
Widać, że ilość dowiązań wynosi teraz 1. Nazwa ~/Desktop/Katalog1/aneta jest więc jedyną i jej skasowanie skasuje plik z jego zawartością.
Napisałem, że polecenia ln używa się podając dowiązanie i cel dowiązania, ale parametr dowiązanie nie jest obowiązkowy. Jeżeli go nie podamy, podając tylko cel dowiązania to dowiązanie zostanie utworzone w katalogu w którym się akurat znajdujemy. Dowiązanie będzie miało taką samą nazwę jak oryginalna.
Rozpatrzmy naszą początkową sytuację. Jeśli chcemy utowrzyć dowiązanie do ~/Desktop/dorota w katalogu ~/Desktop/Katalog1 wystarczy w tym katalogu wydać polecenie:
$ ln ~/Desktop/dorota
Polecenie to utworzy w katalogu ~/Desktop/Katalog1 dowiązanie do ~/Desktop/dorota ale o nazwie dorota (~/Desktop/Katalog1/dorota).
Jeżeli chcemy utworzyć dowiązanie o nazwie aneta, a wydajemy je z katalogu ~/Desktop/Katalog1, wystarczy wydać polecenie:
$ ln ~/Desktop/dorota aneta
Jak widać nie trzeba wpisywać pełnych nazw plików jeśli wydajemy polecenie z katalogu w którym ma znajdować się dowiązanie. (Analogicznie byłby z nazwą dorota jeśli polecenie wydawalibyśmy z katalogu ~/Desktop).
Parametr dowiązanie oprócz tego, że nie jest obowiązkowy to jeśli występuje może być zarówno plikiem jak i katalogiem. Jeśli jest plikiem, tak jak w naszym początkowym przykładzie to podany plik jest tworzony jako dowiązanie do pierwszego. Jeśli jest katalogiem to w nim tworzone jest dowiązanie, ale z taką samą nazwą jak cel dowiązania. Jeśli go brak tak jak w ostatnich przykładach to też tworzone jest dowiązanie z taką samą nazwą jak cel dowiązania tylko dodatkowo w katalogu w którym się akurat znajdujemy (bo żaden nie został określony). Krótko można to przedstawić następująco:
ln plik1 plik2 - tworzy plik2 jako dowiązanie do plik1
ln plik1 Katalog - tworzy w Katalogu dowiązanie do plik1 z taką samą nazwą jak plik1
ln plik1 - tworzy dowiązanie z taką samą nazwą jak plik1 w katalogu w którym jest wydawane
Dowiązania symboliczne (symbolic links). Link symboliczny to dowiązanie do pliku wskazujące na jego nazwę. O ile dowiązanie twarde to była nowa nazwa wskazująca na plik tak samo jak stara to link symboliczny wskazuje na nazwę pliku, która dopiero wskazuje na plik. Linki symboliczne tworzy się analogicznie jak dowiązania twarde tylko dodając do polecenia ln parametr -s. Na przykład ln -s plik1 plik2 utowrzy plik2 jako dowiązanie symboliczne do plik1.
Wracając do naszego pierwotnego przykładu czyli pliku ~/Desktop/dorota i katalogu ~/Desktop/Katalog1. Jeżeli chcemy utworzyć dowiązanie do "dorota" o nazwie "aneta", które będzie się znajdowało w katalogu "Katalog1", ale tym razem ma to być link symboliczny, wydajemy analogiczną komendę ale z parametrem -s:
$ ln -s ~/Desktop/dorota ~/Desktop/Katalog1/aneta
Podobnie jak wcześniej wylistujmy teraz zawartość jednego z katalogów zawierających plik "dorota" lub "aneta". Tym razem niech to będzie ~/Desktop. Wylistowanie katalogu polecenim ls -l pokaże jeden wpis dotyczący pliku "dorota". U mnie wygląda on następująco:
-rw-r--r-- 1 sebastian sebastian 12 cze 27 12:29 dorota
Tym razem widać, że liczba dowiązań się nie zmieniła. Utworzenie linku symbolicznego nie zwiększa liczby dowiązań do pliku. Jeśli wylistujemy zawartość katalogu "Katalog1" ujrzymy jeden wpis dotyczący pliku "aneta". U mnie wygląda on tak:
lrwxrwxrwx 1 sebastian sebastian 30 cze 27 12:25 aneta -> /home/sebastian/Desktop/dorota
Pierwsza litera l informuje o tym że jest to link symboliczny a nie plik zwykły jak było w przypadku dowiązania twardego (tam był myślnik zamiast l). Dalej określone są prawa do pliku (linku), liczba dowiązań 1 i inne jego parametry a następnie określny jest plik do którego odnosi się ten link symboliczny - /home/sebastian/Desktop/dorota.
W przypadku linku symbolicznego wyraźnie rozdzielony jest plik i link symboliczny do pliku. W przypadku dowiązania twardego takiego rozróżnienia nie było. Obie nazwy były równoprawne. Większość operacji wykonywana na linkach symbolicznych wykonywana jest na plikach na które wskazują np. odczyt, zapis, ale już usunięcie usuwa tylko link symboliczny. Może się też zdarzyć, że najpierw zostanie usunięty plik docelowy a prowadzący do niego link symboliczny pozostanie. Wtedy jest to tzw. broken link, który prowadzi do nieistniejącego już pliku. W przypadku dowiązań twardych usunięcie pliku następowało po usunięciu ostatniego dowiązania. W przypadku linków symbolicznych można usunąć plik pomimo że prowadzą do niego linki symboliczne. Dowiązania twarde można tworzyć w obrębie jednego systemu plików natomiast linki symboliczne nie mają takiego ograniczenia. Ponadto linki symboliczne w przeciwieństawie do dowiązań twardych można tworzyć zarówno do plików jak i katalogów.
ln cel_dowiązania dowiązanie
gdzie:
cel_dowiązania - plik do którego chcemy zrobić dowiązanie
dowiązanie - plik, który będzie stanowił dowiązanie do pierwszego
Przykład. Weźmy pod uwagę plik "dorota" znajdujący się na pulpicie, którego ścieżka jest następująca: ~/Desktop/dorota. W moim przypadku jest to /home/sebastian/Desktop/dorota. (Znak "~" oznacza katalog domowy użytkownika). Na pulpicie znajduje się katalog "Katalog1" w którym chcemy zrobić dowiązanie do "dorota". Ścieżka do katalogu to ~/Desktop/Katalog1. Chcemy zrobic dowiązanie o nazwie "aneta". Wówczas cel dowiązania i dowiązanie będą następujące:
cel dowiązania - ~/Desktop/dorota
dowiązanie - ~/Desktop/Katalog1/aneta
Polecenie ln będzie wyglądało następująco:
$ ln ~/Desktop/dorota ~/Desktop/Katalog1/aneta
Polecenie to utworzy nam w katalogu "Katalog1" plik "aneta", który będzie dowiązaniem do pliku "dorota" znajdującego się na pulpicie (w katalogu ~/Desktop). W ten sposób nadaliśmy plikowi nową nazwę, która jest równoprawna ze starą. Oba pliki mają taką samą (wskazują na tą samą) zawartość.
Liczbę dowiązań do plików można sprawdzić wydając polecenie ls -l, które listuje zawartość katalogu podając kilka parametrów plików w nim zawartych. Jeśli wydamy to polecenie w katalogu "Katalog1" otrzymamy jeden wpis dotyczący pliku "aneta". U mnie wygląda on następująco:
$ ls -l
-rw-r--r-- 2 sebastian sebastian 12 cze 26 18:30 aneta
Pierwszy myślnik oznacza że jest to plik zwykły, pozostałe litery r,w i myślniki określają prawa dostępu do pliku. Cyfra 2 znajdująca się za nimi oznacza właśnie liczbę dowiązań. Pierwszym dowiązaniem jest nazwa ~/Desktop/dorota, drugim - ~/Desktop/Katalog1/aneta. Obie są równoprawne. Skasowanie jednej z nich nie kasuje zawartości pliku. Aby skasować plik należy skasować wszystkie dowiązania do niego. Plik zostaje skasowany w momencie skasowania ostatniego dowiązania twardego (nazwy). Jeżeli wylistujemy zawartość katalogu ~/Desktop otrzymamy analogiczny wpis z nazwą dorota, który też pokaże liczbę dowiązań 2.
Skasujmy teraz jedną nazwę np: rm ~/Desktop/dorota
Listujemy ponownie katalog "Katalog1":
$ ls -l
-rw-r--r-- 1 sebastian sebastian 12 cze 26 18:30 aneta
Widać, że ilość dowiązań wynosi teraz 1. Nazwa ~/Desktop/Katalog1/aneta jest więc jedyną i jej skasowanie skasuje plik z jego zawartością.
Napisałem, że polecenia ln używa się podając dowiązanie i cel dowiązania, ale parametr dowiązanie nie jest obowiązkowy. Jeżeli go nie podamy, podając tylko cel dowiązania to dowiązanie zostanie utworzone w katalogu w którym się akurat znajdujemy. Dowiązanie będzie miało taką samą nazwę jak oryginalna.
Rozpatrzmy naszą początkową sytuację. Jeśli chcemy utowrzyć dowiązanie do ~/Desktop/dorota w katalogu ~/Desktop/Katalog1 wystarczy w tym katalogu wydać polecenie:
$ ln ~/Desktop/dorota
Polecenie to utworzy w katalogu ~/Desktop/Katalog1 dowiązanie do ~/Desktop/dorota ale o nazwie dorota (~/Desktop/Katalog1/dorota).
Jeżeli chcemy utworzyć dowiązanie o nazwie aneta, a wydajemy je z katalogu ~/Desktop/Katalog1, wystarczy wydać polecenie:
$ ln ~/Desktop/dorota aneta
Jak widać nie trzeba wpisywać pełnych nazw plików jeśli wydajemy polecenie z katalogu w którym ma znajdować się dowiązanie. (Analogicznie byłby z nazwą dorota jeśli polecenie wydawalibyśmy z katalogu ~/Desktop).
Parametr dowiązanie oprócz tego, że nie jest obowiązkowy to jeśli występuje może być zarówno plikiem jak i katalogiem. Jeśli jest plikiem, tak jak w naszym początkowym przykładzie to podany plik jest tworzony jako dowiązanie do pierwszego. Jeśli jest katalogiem to w nim tworzone jest dowiązanie, ale z taką samą nazwą jak cel dowiązania. Jeśli go brak tak jak w ostatnich przykładach to też tworzone jest dowiązanie z taką samą nazwą jak cel dowiązania tylko dodatkowo w katalogu w którym się akurat znajdujemy (bo żaden nie został określony). Krótko można to przedstawić następująco:
ln plik1 plik2 - tworzy plik2 jako dowiązanie do plik1
ln plik1 Katalog - tworzy w Katalogu dowiązanie do plik1 z taką samą nazwą jak plik1
ln plik1 - tworzy dowiązanie z taką samą nazwą jak plik1 w katalogu w którym jest wydawane
Dowiązania symboliczne (symbolic links). Link symboliczny to dowiązanie do pliku wskazujące na jego nazwę. O ile dowiązanie twarde to była nowa nazwa wskazująca na plik tak samo jak stara to link symboliczny wskazuje na nazwę pliku, która dopiero wskazuje na plik. Linki symboliczne tworzy się analogicznie jak dowiązania twarde tylko dodając do polecenia ln parametr -s. Na przykład ln -s plik1 plik2 utowrzy plik2 jako dowiązanie symboliczne do plik1.
Wracając do naszego pierwotnego przykładu czyli pliku ~/Desktop/dorota i katalogu ~/Desktop/Katalog1. Jeżeli chcemy utworzyć dowiązanie do "dorota" o nazwie "aneta", które będzie się znajdowało w katalogu "Katalog1", ale tym razem ma to być link symboliczny, wydajemy analogiczną komendę ale z parametrem -s:
$ ln -s ~/Desktop/dorota ~/Desktop/Katalog1/aneta
Podobnie jak wcześniej wylistujmy teraz zawartość jednego z katalogów zawierających plik "dorota" lub "aneta". Tym razem niech to będzie ~/Desktop. Wylistowanie katalogu polecenim ls -l pokaże jeden wpis dotyczący pliku "dorota". U mnie wygląda on następująco:
-rw-r--r-- 1 sebastian sebastian 12 cze 27 12:29 dorota
Tym razem widać, że liczba dowiązań się nie zmieniła. Utworzenie linku symbolicznego nie zwiększa liczby dowiązań do pliku. Jeśli wylistujemy zawartość katalogu "Katalog1" ujrzymy jeden wpis dotyczący pliku "aneta". U mnie wygląda on tak:
lrwxrwxrwx 1 sebastian sebastian 30 cze 27 12:25 aneta -> /home/sebastian/Desktop/dorota
Pierwsza litera l informuje o tym że jest to link symboliczny a nie plik zwykły jak było w przypadku dowiązania twardego (tam był myślnik zamiast l). Dalej określone są prawa do pliku (linku), liczba dowiązań 1 i inne jego parametry a następnie określny jest plik do którego odnosi się ten link symboliczny - /home/sebastian/Desktop/dorota.
W przypadku linku symbolicznego wyraźnie rozdzielony jest plik i link symboliczny do pliku. W przypadku dowiązania twardego takiego rozróżnienia nie było. Obie nazwy były równoprawne. Większość operacji wykonywana na linkach symbolicznych wykonywana jest na plikach na które wskazują np. odczyt, zapis, ale już usunięcie usuwa tylko link symboliczny. Może się też zdarzyć, że najpierw zostanie usunięty plik docelowy a prowadzący do niego link symboliczny pozostanie. Wtedy jest to tzw. broken link, który prowadzi do nieistniejącego już pliku. W przypadku dowiązań twardych usunięcie pliku następowało po usunięciu ostatniego dowiązania. W przypadku linków symbolicznych można usunąć plik pomimo że prowadzą do niego linki symboliczne. Dowiązania twarde można tworzyć w obrębie jednego systemu plików natomiast linki symboliczne nie mają takiego ograniczenia. Ponadto linki symboliczne w przeciwieństawie do dowiązań twardych można tworzyć zarówno do plików jak i katalogów.
27 komentarzy:
Ale namieszales .... :) Dla domowego lx-siarza to jak maslo maslane - niby tyle opisane, a nic konkretnego z tego nie wynika :) Niech ktos sie tylko spyta czy dowiazanie to to samo co skrot, i dlaczego jesli skasujesz plik do ktorego istnieje hardlink to ten hardlink dalej bedzie wskazywal na plik, ktory ... wlasnie zostal skasowany :D Powodzenia.
Czy dowiązanie to to samo co skrót? ;)
A tak na wpół poważnie, przed chwilą zacząłem sobie czytać o linkach symbolicznych i twardych i jakoś nie mogę ich ogarnąć.
Do czego mogą się przydać w życiu codziennym, dla przeciętnego użytkownika? I jak je usunąć?
A jak spawdzić czy:
1. dorota ma link symboliczny
2. jaka jest nazwa tego linku symbolicznego i jak jest jego scieżka
Jak dla mnie, to super opis :) Z musu musze zająć się komendami shella, bo zacząłem używać routera i NASa opartych na linuxie. System trochę śmieci i trzeba czasem ręcznie zrobić porządek. I ten artykuł pozwolił mi pozbyć się wątpliwośći odnoście komendy ln, a przejrzałem już parę opisów.. Dzięki.
Moim zdaniem swietny opis!! W koncu w pelni zrozumialem roznice pomiedzy linkami twardymi a symblicznymi! Dzieki! :)
Świetny artykuł. Dzięki Tobie w końcu to ogarnąłem. ;-)
Uważam, że jest to bardzo czytelny i wartościowy artykuł opisujący zasadę działania dowiązań. Dzięki temu wyjaśniłem wszelkie wątpliwości. Dziękuję bardzo autorowi.
jestem poczatkujący i nie miałem problemów ze zrozumieniem, dzięki za artykuł
ja zgadzam się z przedmówcami. Po 20 minutach szukania i czytania (i próbowania) znalazłem ten artykuł i już wszystko piknie rozumiem :) dzięki wielkie!!!
Wszystko piknie rozkminiłem w temacie linków, ale pojawia się w mojej głowie nurtujące pytanie, które może być początkiem kolejnego art-a jako uzupełnienie.
Bo o ile dość łatwo zorientować się która nazwa w file systemie jest linkiem symbolicznym i do którego źródła prowadzi o tyle dość trudno się połapać w temacie linka twardego tj. czy to na pewno on i gdzie (w których katalogach) znajdują się równoprawne twarde dowiązania np. z innymi nazwami.
To już nie jest takie oczywiste.
Wszystko zrozumialem! Dzieki bardzo!
fajnie napisane, pomogło mi
Pozdrawiam
ln -l
Przykład:
ls -l /usr/lib/nazwa_pliku
Można było wyróżnić i napisać ze pokazuje zawartość co plik robi ( rodzaj podglądu ), słowo "listuje"
nie wiele mówi
super artykul, wreszcie rozumiem, dzięki :)
Dzięki! Szacun dla Autora i ukłon.
Jebać Was wszystkich i autora. Kurwy jebane w dupe szmaty.
Wy jebane kurwy pan wyżej ma racje.
ma racje!
Rewelka opis, dzięki!
Bardzo fajnie opisane, myślę, że zrozumiałe dla każdego, kto zna chociaż podstawy...
Tak jak już ktoś z przodu pisał, niby wyjaśnione jak użyć, ale tak naprawdę dalej nie wiadomo, które lepiej kiedy używać i czym tak dokładniej się różnią...
bardzo fajna lekcja :D
krystua gejjjjjjjj\
złów Oskarrr
Opisane fajnie i przejrzyście Super dzięki za artykuł
Dla tych którzy Nie zrozumieli Czym jest dowiązanie twarde i symboliczne
Symboliczne to skrót do pliku
Twarde to tak jakby oszczedna kopia pliku
To nic nie pomaga. Próbowałem zrobić dowiązanie do pliku i wyszło mi, że nie ma takiego pliku ani katalogu.
Prześlij komentarz