Qual è il numero tra l'autorizzazione del file e il proprietario nell'output del comando ls -l?


35

L'output del ls -lcomando produce il seguente risultato:

inserisci qui la descrizione dell'immagine

Qual è il campo numerico tra l'autorizzazione del file e il proprietario? cioè quali sono quelli 1, 1, 1 e 2 ? Ho controllato il --helpma questo non lo spiega.

[EDIT] Ho pensato che fosse il numero di file in una directory ma non lo è. Vedi l'immagine "tempFolder" ha 3 file ma mostra ancora un "2"

Risposte:


33

Nota: modificato dopo il commento di @StephaneChazelas

Il primo numero ls -ldell'output dopo il blocco delle autorizzazioni è il numero di collegamenti reali .

È lo stesso valore di quello restituito dal statcomando in "Collegamenti".

Questo numero è il conteggio del collegamento hardlink del file, quando si fa riferimento a un file, o il numero di voci di directory contenute, quando si fa riferimento a una directory.

Un file in genere ha un conteggio dei collegamenti fissi pari a 1, ma ciò cambia se vengono creati collegamenti fissi con il lncomando. Vedi il manuale di riferimento Debian .

Nel tuo esempio, l'aggiunta di un collegamento reale per tempFile2 aumenterà il conteggio dei collegamenti:

ln -l
ln tempFile2 tempHardLink
ln -l

Sia tempFile2 che tempHardLink avranno un conteggio dei collegamenti pari a 2.

Se fai lo stesso esercizio con un link simbolico ( ln -s tempFile2 tempSymLink), il valore del conteggio non aumenterà.

Una directory avrà un conteggio minimo di 2 per '.'(collegamento a se stesso) e per la voce nella directory del suo genitore.

Nel tuo esempio, se vuoi aumentare il conteggio dei collegamenti di tempFolder , crea una nuova directory e il numero salirà.

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

Il collegamento da un'altra Cartella / a Cartella / (che è ..) verrà aggiunto al conteggio.



Dal momento che viene visualizzato tra le autorizzazioni e la proprietà, hai l'impressione che sia molto importante, ma non l'ho mai usato. Quando è in genere necessario?
Emanuel Berg,

1
Non è corretto È il conteggio dei collegamenti, punto. Per le directory, hai 2 per la sua voce nella sua directory principale (proprio come qualsiasi file) e la .voce in sé, più una per le ..voci in ciascuno dei suoi sottodir.
Stéphane Chazelas,

@StephaneChazelas Tutta la documentazione che ho trovato parla del conteggio dei collegamenti fisici (ad esempio, linuxgazette.net/issue35/tag/links.html ). Inoltre ho scoperto che una domanda simile è stata posta in AskUbuntu ( askubuntu.com/questions/19510/… ). Controllerò il codice sorgente di coreutils e vedrò se riesco a capire la risposta esatta.
Damien,

2
@EmanuelBerg quando i file system erano molto meno affidabili di quanto lo siano ora e tu stavi lavorando sul file system che hai sviluppato, e lspotevi spendere 2 caratteri e darti maggiori informazioni, e non c'erano stat(1)comandi né find(1)fsck, né collegamenti simbolici era probabilmente molto più utile di quanto non sia oggi. Non può essere modificato senza rompere gli script della shell i cui scrittori sono passati da molto tempo /dev/null; È stato così almeno dal 1979.
msw,

8

Su Unix, in genere, un file è una voce in una tabella di file. Esistono diversi tipi di file: file regolari, dispositivi, collegamenti symbolik, porte, pipe, socket, directory ...

Il numero di inode (che puoi vedere nell'output di ls -i) è l'indice in quella tabella.

Ora, non accedi ai file per inode ma per percorso . Un percorso è una catena di voci della directory . Noterai che non stiamo parlando di cartella ma di directory qui. Perché è quello che è una directory (pensa a una rubrica telefonica).

Una directory è un tipo speciale di file che dà nomi a un numero di inode. Una voce di directory è una mappatura da un nome a un inode.

Un determinato file (un inode) può avere più di un nome in una directory (proprio come può esserci più di un nome in un numero di telefono) e può anche avere nomi (voci) in più di una directory. Questi sono chiamati collegamenti noti anche come collegamenti reali per distinguere con collegamenti software (un tipo speciale di file che è un puntatore a un percorso).

Un file (inode) tiene traccia del numero di collegamenti (di voci in qualsiasi directory) che ha, in modo che quando il numero raggiunge 0 (quando viene scollegato dall'ultima directory in cui è stato fatto riferimento), viene deallocato.

Questo è quel numero (il numero di collegamenti) che viene visualizzato ls -lnell'output.

Quando un file non di directory viene creato per la prima volta (con le chiamate di sistema openo creat(o bindo mknodper alcuni tipi di file)), viene eseguito fornendo un percorso al nuovo file (come "/a/b"). Quello che succede allora è un nuovo file e l'inode viene allocato e una nuova voce viene aggiunta alla directory associata al "a"nome nella "/"directory principale. Questo è il collegamento iniziale, quindi il conteggio dei collegamenti è uno.

Più collegamenti possono essere aggiunti in seguito con la link()chiamata di sistema (il lncomando). E i collegamenti possono essere rimossi con la unlink()chiamata di sistema (il rmcomando).

Noterai che i file di tipo directory hanno generalmente un numero di collegamenti maggiore o uguale a 2.

Ora, quando crei una directory, stai chiamando la mkdir()chiamata di sistema. Qualcosa del genere mkdir("/a/b"). Ciò che fa quindi è allocare un nuovo file di tipo directory. In quella nuova directory, crea automaticamente due voci:

  • "."( punto per directory ). Quale è un collegamento a se stesso. Quindi il conteggio dei collegamenti è ora 1.
  • ".."(per la directory della directory ). Che è un collegamento a "/a". Quindi il conteggio dei collegamenti di "/a"viene incrementato di uno

Quindi quella nuova directory viene collegata "/a"(viene aggiunta una voce "/a"per essa), quindi il suo conteggio dei collegamenti è ora 2. Se "/a/b/c"viene creata una directory, a causa della ".."voce in "/a/b/c", il conteggio dei collegamenti "/a/b"diventerà 3.

La maggior parte degli Unices limita la creazione di ulteriori collegamenti a una directory perché possono causare loop problematici. Quando consentono a link()su una directory, generalmente solo il superutente può farlo.

Alcuni filesystem come si btrfsallontanano da quella struttura di directory tradizionale. Noterai che i conteggi dei collegamenti nelle directory nei btrfsfile system sono sempre uno anche se tali directory contengono una "."voce con lo stesso numero di inode di loro stessi.

Il fatto che il conteggio dei collegamenti sia tradizionalmente 2 più il numero di sottodiretti è utile. Ad esempio, in:

find . -name '*.c' -print

Se .non contiene sottodirectory ma contiene milioni di file. Controllando il conteggio dei collegamenti di ., è findpossibile sapere che non esiste un sottodir. Quindi tutto ciò che finddeve fare è leggere il contenuto della directory e riportare le voci che finiscono .c(come un grep '\.c$'file da pochi megabyte, nessun grosso problema). Altrimenti, finddovrebbe controllare il tipo di ogni singolo file per vedere se ci sono delle directory in cui scendere (risultando in altrettante lstat()chiamate di sistema). Ovviamente, questo tipo di ottimizzazione non funziona btrfs(sebbene nelle versioni moderne di Linux, il tipo di file sia anche memorizzato nella voce della directory per alcuni filesystem (incluso btrfs) e restituito dalla getdents(2)chiamata di sistema utilizzata per recuperare l'elenco delle voci in una directory, quindilstat non è ancora necessario).


+1, ottima risposta :) Guardando il codice sorgente di ls, ho notato che il numero del collegamento è stato aggiornato dopo una chiamata a stat. Quindi il comando stat ti darà il valore dei collegamenti per un file o una directory.
Damien,

Cosa significa avere al -posto di un numero qualsiasi dopo le autorizzazioni ls -lnell'output?
Shubham,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.