Ponieważ jest wyświetlany między uprawnieniami a własnością, masz wrażenie, że jest to bardzo ważne, ale nigdy go nie użyłem. Kiedy jest to zwykle potrzebne?
Emanuel Berg
1
To jest niepoprawne Jest to liczba linków, kropka. W przypadku katalogów masz 2 dla wpisu w katalogu nadrzędnym (jak każdy plik) i .wpis sam w sobie, plus jeden dla ..wpisów w każdym podkatalogu.
Stéphane Chazelas
@StephaneChazelas Cała dokumentacja, którą znalazłem, mówi o twardej liczbie linków (na przykład linuxgazette.net/issue35/tag/links.html ). Odkryłem również, że podobne pytanie zostało zadane w AskUbuntu ( askubuntu.com/questions/19510/… ). Sprawdzę kod źródłowy coreutils i zobaczę, czy mogę znaleźć dokładną odpowiedź.
Damien
2
@EmanuelBerg gdy systemy plików były znacznie mniej wiarygodne niż są teraz, a pracowało w systemie plików, który rozwinięty, a lsmógłby spędzić 2 znaki i podać więcej informacji, i nie było stat(1)polecenia ani find(1)ani fsckani dowiązania to chyba o wiele bardziej przydatne niż jest dzisiaj. Nie można tego zmienić bez rozbijania skryptów powłoki, w których pisarze mają długą historię /dev/null; Tak było przynajmniej od 1979 r.
msw
8
W systemie Unix plik zazwyczaj stanowi pewien wpis w tabeli plików. Istnieją różne rodzaje plików: zwykłe pliki, urządzenia, linki symbolik, drzwi, rury, gniazda, katalogi ...
Numer i-węzła (który można zobaczyć na wyjściu ls -i) to indeks w tej tabeli.
Teraz nie masz dostępu do plików według i- węzła, ale według ścieżki . Ścieżka jest łańcuchem katalogów wpisów. Zauważysz, że nie mówimy tutaj o folderze, ale o katalogu . Ponieważ taki jest katalog (pomyśl o książce telefonicznej).
Katalog to specjalny rodzaj pliku, który nadaje nazwy wielu i-węzłom. Wpis w katalogu to odwzorowanie nazwy na i-węzeł.
Dany plik (i-węzeł) może mieć więcej niż jedną nazwę w jednym katalogu (tak jak może istnieć więcej niż jedna nazwa pod numerem telefonu), a także może mieć nazwy (wpisy) w więcej niż jednym katalogu. Nazywa się je również linkami znanymi jako twarde, które można odróżnić za pomocą linków miękkich (specjalny typ pliku, który jest wskaźnikiem ścieżki).
Plik (i-węzeł) śledzi liczbę odnośników (wpisów w dowolnym katalogu), które posiada, dzięki czemu, gdy liczba osiągnie 0 (gdy jest odłączony od ostatniego katalogu, do którego się odwołuje), zostaje cofnięta.
Jest to liczba (liczba linków) wyświetlana na ls -lwyjściu.
Kiedy po raz pierwszy plik nie zostanie utworzony katalog (z openlub creat(lub bindlub mknoddla niektórych typów plików) wywołuje System), odbywa się poprzez dostarczenie ze ścieżką do nowego pliku (jak "/a/b"). To, co się wtedy dzieje, to nowy plik i i-węzeł jest przydzielany, a nowy wpis jest dodawany do katalogu związanego z "a"nazwą w "/"katalogu głównym. To jest początkowy link, więc liczba linków wynosi jeden.
Więcej łączy można dodać później za pomocą link()wywołania systemowego ( lnpolecenia). Łącza można usunąć za pomocą unlink()wywołania systemowego ( rmpolecenia).
Zauważysz, że pliki katalogu typu mają zazwyczaj liczbę linków większą lub równą 2.
Teraz, gdy tworzysz katalog, wywołujesz wywołanie mkdir()systemowe. Coś jak mkdir("/a/b"). Następnie przydziela nowy plik katalogu typu. W tym nowym katalogu automatycznie tworzy dwa wpisy:
"."( kropka na katalog ). Który jest linkiem do siebie. Więc liczba linków wynosi teraz 1.
".."(dla katalogu jest katalog ). Który jest linkiem do "/a". Więc liczba linków "/a"jest zwiększana o jeden
Następnie ten nowy katalog jest łączony "/a"( "/a"dla niego dodawany jest wpis ), więc jego liczba odsyłaczy wynosi teraz 2. Jeśli "/a/b/c"katalog zostanie utworzony, z powodu ".."wpisu "/a/b/c", liczba odsyłaczy "/a/b"zmieni się na 3.
Większość Unices ogranicza tworzenie dalszych linków do katalogu, ponieważ mogą powodować problematyczne pętle. Jeśli pozwalają link()na katalog, zazwyczaj tylko administrator może to zrobić.
Niektóre systemy plików, jak na przykład, btrfsodchodzą od tej tradycyjnej struktury katalogów. Zauważysz, że liczba linków w katalogach w btrfssystemach plików jest zawsze równa jeden, mimo że katalogi te zawierają "."wpis o takim samym numerze i-węzła, jak w nich samych.
Fakt, że liczba łączy wynosi tradycyjnie 2 plus liczba podkatalogów, ma swoje zastosowanie. Na przykład w:
find . -name '*.c' -print
Jeśli .nie zawiera podkatalogów, ale zawiera miliony plików. Sprawdzając liczbę linków ., findmożesz wiedzieć, że nie ma podkatalogu. Wszystko, findco należy zrobić, to przeczytać zawartość katalogu i zgłosić wpisy, które kończą się na .c(jak grep '\.c$'na pliku o wielkości kilku megabajtów, nic wielkiego). W przeciwnym razie findmusiałby sprawdzić typ każdego pojedynczego pliku, aby sprawdzić, czy są w nim katalogi, do których można zejść (powodując tyle lstat()wywołań systemowych). Oczywiście tego rodzaju optymalizacja nie działa btrfs(chociaż we współczesnych wersjach systemu Linux typ plików jest także zapisywany we wpisie katalogu dla niektórych systemów plików (w tym btrfs) i zwracany przez getdents(2)wywołanie systemowe użyte do pobrania listy wpisów w katalogu, więclstat nadal nie jest konieczne).
+1, świetna odpowiedź :) Spoglądając na kod źródłowy ls, zauważyłem, że numer linku został zaktualizowany po wywołaniu stat. Zatem polecenie stat poda ci wartość linków do pliku lub katalogu.
Damien
Co to znaczy mieć -zamiast dowolnej liczby w miejscu po uzyskaniu pozwoleń na ls -lwyjściu?
.
wpis sam w sobie, plus jeden dla..
wpisów w każdym podkatalogu.ls
mógłby spędzić 2 znaki i podać więcej informacji, i nie byłostat(1)
polecenia anifind(1)
anifsck
ani dowiązania to chyba o wiele bardziej przydatne niż jest dzisiaj. Nie można tego zmienić bez rozbijania skryptów powłoki, w których pisarze mają długą historię/dev/null
; Tak było przynajmniej od 1979 r.W systemie Unix plik zazwyczaj stanowi pewien wpis w tabeli plików. Istnieją różne rodzaje plików: zwykłe pliki, urządzenia, linki symbolik, drzwi, rury, gniazda, katalogi ...
Numer i-węzła (który można zobaczyć na wyjściu
ls -i
) to indeks w tej tabeli.Teraz nie masz dostępu do plików według i- węzła, ale według ścieżki . Ścieżka jest łańcuchem katalogów wpisów. Zauważysz, że nie mówimy tutaj o folderze, ale o katalogu . Ponieważ taki jest katalog (pomyśl o książce telefonicznej).
Katalog to specjalny rodzaj pliku, który nadaje nazwy wielu i-węzłom. Wpis w katalogu to odwzorowanie nazwy na i-węzeł.
Dany plik (i-węzeł) może mieć więcej niż jedną nazwę w jednym katalogu (tak jak może istnieć więcej niż jedna nazwa pod numerem telefonu), a także może mieć nazwy (wpisy) w więcej niż jednym katalogu. Nazywa się je również linkami znanymi jako twarde, które można odróżnić za pomocą linków miękkich (specjalny typ pliku, który jest wskaźnikiem ścieżki).
Plik (i-węzeł) śledzi liczbę odnośników (wpisów w dowolnym katalogu), które posiada, dzięki czemu, gdy liczba osiągnie 0 (gdy jest odłączony od ostatniego katalogu, do którego się odwołuje), zostaje cofnięta.
Jest to liczba (liczba linków) wyświetlana na
ls -l
wyjściu.Kiedy po raz pierwszy plik nie zostanie utworzony katalog (z
open
lubcreat
(lubbind
lubmknod
dla niektórych typów plików) wywołuje System), odbywa się poprzez dostarczenie ze ścieżką do nowego pliku (jak"/a/b"
). To, co się wtedy dzieje, to nowy plik i i-węzeł jest przydzielany, a nowy wpis jest dodawany do katalogu związanego z"a"
nazwą w"/"
katalogu głównym. To jest początkowy link, więc liczba linków wynosi jeden.Więcej łączy można dodać później za pomocą
link()
wywołania systemowego (ln
polecenia). Łącza można usunąć za pomocąunlink()
wywołania systemowego (rm
polecenia).Zauważysz, że pliki katalogu typu mają zazwyczaj liczbę linków większą lub równą 2.
Teraz, gdy tworzysz katalog, wywołujesz wywołanie
mkdir()
systemowe. Coś jakmkdir("/a/b")
. Następnie przydziela nowy plik katalogu typu. W tym nowym katalogu automatycznie tworzy dwa wpisy:"."
( kropka na katalog ). Który jest linkiem do siebie. Więc liczba linków wynosi teraz 1.".."
(dla katalogu jest katalog ). Który jest linkiem do"/a"
. Więc liczba linków"/a"
jest zwiększana o jedenNastępnie ten nowy katalog jest łączony
"/a"
("/a"
dla niego dodawany jest wpis ), więc jego liczba odsyłaczy wynosi teraz 2. Jeśli"/a/b/c"
katalog zostanie utworzony, z powodu".."
wpisu"/a/b/c"
, liczba odsyłaczy"/a/b"
zmieni się na 3.Większość Unices ogranicza tworzenie dalszych linków do katalogu, ponieważ mogą powodować problematyczne pętle. Jeśli pozwalają
link()
na katalog, zazwyczaj tylko administrator może to zrobić.Niektóre systemy plików, jak na przykład,
btrfs
odchodzą od tej tradycyjnej struktury katalogów. Zauważysz, że liczba linków w katalogach wbtrfs
systemach plików jest zawsze równa jeden, mimo że katalogi te zawierają"."
wpis o takim samym numerze i-węzła, jak w nich samych.Fakt, że liczba łączy wynosi tradycyjnie 2 plus liczba podkatalogów, ma swoje zastosowanie. Na przykład w:
Jeśli
.
nie zawiera podkatalogów, ale zawiera miliony plików. Sprawdzając liczbę linków.
,find
możesz wiedzieć, że nie ma podkatalogu. Wszystko,find
co należy zrobić, to przeczytać zawartość katalogu i zgłosić wpisy, które kończą się na.c
(jakgrep '\.c$'
na pliku o wielkości kilku megabajtów, nic wielkiego). W przeciwnym raziefind
musiałby sprawdzić typ każdego pojedynczego pliku, aby sprawdzić, czy są w nim katalogi, do których można zejść (powodując tylelstat()
wywołań systemowych). Oczywiście tego rodzaju optymalizacja nie działabtrfs
(chociaż we współczesnych wersjach systemu Linux typ plików jest także zapisywany we wpisie katalogu dla niektórych systemów plików (w tymbtrfs
) i zwracany przezgetdents(2)
wywołanie systemowe użyte do pobrania listy wpisów w katalogu, więclstat
nadal nie jest konieczne).źródło
-
zamiast dowolnej liczby w miejscu po uzyskaniu pozwoleń nals -l
wyjściu?