Jaka jest liczba między uprawnieniami do pliku a właścicielem w danych wyjściowych polecenia ls -l?

35

Dane wyjściowe ls -lpolecenia dają następujący wynik:

wprowadź opis zdjęcia tutaj

Jakie jest pole liczbowe między uprawnieniem do pliku a właścicielem? tj. jakie są te 1, 1, 1 i 2 ? Sprawdziłem, --helpale to nie wyjaśnia.

[EDYCJA] Myślałem, że to liczba plików w katalogu, ale tak nie jest. Zobacz obraz. „tempFolder” ma 3 pliki, ale nadal pokazuje „2”

KMC
źródło

Odpowiedzi:

33

Uwaga: edytowane po komentarzu @StephaneChazelas

Pierwszą liczbą danych ls -lwyjściowych po bloku uprawnień jest liczba twardych dowiązań .

Jest to ta sama wartość, co wartość zwrócona przez statpolecenie w „Łączach”.

Liczba ta jest liczbą dowiązań twardych pliku, gdy odnosi się do pliku, lub liczbą zawartych pozycji katalogu, gdy odnosi się do katalogu.

Plik ma zazwyczaj twarde liczby linków 1, ale to zmienia jeśli dowiązania twarde wykonane są z lnpolecenia. Zobacz podręcznik Debian Reference .

W twoim przykładzie dodanie twardego linku do tempFile2 zwiększy jego liczbę linków:

ln -l
ln tempFile2 tempHardLink
ln -l

Zarówno tempFile2, jak i tempHardLink będą miały liczbę łączy 2.

Jeśli wykonasz to samo ćwiczenie z dowiązaniem symbolicznym ( ln -s tempFile2 tempSymLink), wartość zliczania nie wzrośnie.

Katalog będzie miał liczyć minimum 2 dla '.'(link do siebie) i do wejścia w katalogu jego rodzica.

W twoim przykładzie, jeśli chcesz zwiększyć liczbę linków tempFoldera , utwórz nowy katalog, a liczba wzrośnie.

ls -l tempFolder
mkdir tempFolder/anotherFolder
ls -l tempFolder

Link z anotherFolder / do tempFolder / (który jest ..) zostanie dodany do liczby.

Damien
źródło
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).

Stéphane Chazelas
źródło
+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?
Shubham