Manpages

NOME

locatedb − base di dati di nomi di file compressa con front

DESCRIZIONE

Questa pagina di manuale documenta il formato delle basi di dati di nomi di file per la versione GNU di locate. Le basi di dati di nomi di file contengono le liste dei file presenti in particolari directory l’ultima volta che tali basi di dati sono state aggiornate.

Ci possono essere diverse basi di dati. Gli utenti possono decidere su quali basi di dati locate deve fare la ricerca usando una variabile d’ambiente o un’opzione in riga di comando; si veda locate(1L). L’amministratore di sistema può scegliere il nome di file della base di dati di default, la frequenza con la quale sono aggiornate le basi di dati, e le directory per le quali queste contengono informazioni. Solitamente, le basi di dati di nomi di file sono aggiornate lanciando periodicamente il programma updatedb (tipicamente di notte); si veda updatedb(1L).

updatedb lancia un programma chiamato frcode per comprimere, usando la compressione front ("front-compression"), le liste di nomi di file, riducendo in tal modo la dimensione della base di dati di 4 o 5 volte. La compressione front (nota anche come codifica incrementale - "incremental encoding") funziona come segue.

Le voci della base di dati sono una lista ordinata (considerando, per convenienza dell’utente, maiuscole e minuscole equivalenti). Poiché la lista è ordinata, è probabile che ogni voce condivida un prefisso (stringa iniziale) con la voce precedente. Ogni voce della base di dati inizia con un byte di conteggio dell’offset differenziale ("offset-differential count byte"), che è il numero di caratteri del prefisso della voce precedente da usare, oltre a quelli che tale voce usa dei suoi predecessori (il contatore può essere negativo). Dopo del contatore c’è il rimanente ASCII (terminato con un null) — la parte del nome che segue il prefisso condiviso.

Se il valore dell’offset differenziale è maggiore di quanto è immagazzinabile in un byte (+/−127), tale byte sarà posto pari a 0x80 e il contatore seguirà in una parola di 2 byte, con il byte più significativo per primo (ordinamento dei byte di rete −"network byte order").

Ogni base di dati inizia con una voce fittizia per il file chiamato ’LOCATE02’, che locate controlla per assicurarsi che il formato della base di dati sia corretto; questa voce è ignorata durante la ricerca.

Le basi di dati non possono essere concatenate una all’altra, anche se la prima voce (quella fittizia) è rimossa da tutte tranne che dalla prima. Questo perché il valore dell’offset differenziale della prima voce della seconda e delle successive basi di dati sarà errato.

Ciò vale anche per il vecchio formato delle basi di dati usato dai programmi Unix locate e find e dalle prime release delle versioni GNU. updatedb lancia i programmi chiamati bigram e code per produrre le basi di dati nel vecchio formato. Il vecchio formato differisce dalla descrizione precedente nel seguente modo. Invece di far iniziare ogni voce con con un byte per il contatore dell’offset differenziale e farla finire con un null, i valori del byte da 0 a 28 indicano un valore dell’offset differenziale da -14 a 14. Il valore del byte che indica che di seguito è presente un contatore dell’offset differenziale lungo è 0x1e (30), non 0x80. I contatori lunghi sono immagazzinati nell’ordine di byte della macchina ("host byte order"), che non è necessariamente il network byte order, e nella dimensione delle parole della macchina, che di solito è di 4 byte. Questi inoltre rappresentano un numero che è 14 in meno del loro valore effettivo. Le righe della base di dati non hanno nessun byte di terminazione; l’inizio della riga successiva è indicato dal primo byte che ha valore minore o uguale a 30.

Inoltre, invece di cominciare con una voce fittizia, il vecchio formato delle basi di dati inizia con un tabella di 256 byte contenente i 128 "bigrammmi" più comuni nella lista dei file. Un bigrammma ("bigram") è una coppia di byte adiacenti. I byte che nella base di dati hanno il bit più significativo a 1 sono indicizzati (con il bit più significativo posto a 0) nella tabella dei bigrammi. I bigrammi e la codifica dei contatori dell’offset differenziale rendono queste basi di dati il 20-25% più piccole rispetto a quelle nel nuovo formato, ma fanno sì che non siano "8-bit clean". Qualsiasi byte che in un nome di file è nel range usato per i codici speciali viene rimpiazzato nella base di dati da un punto di domanda, il quale non a caso è il metacarattere della shell che corrisponde ad un qualsiasi carattere singolo.

ESEMPIO

Ingresso a frcode:
/usr/src
/usr/src/cmd/aardvark.c
/usr/src/cmd/armadillo.c
/usr/tmp/zoo

Lunghezza dei prefissi più lunghi condivisi con le voci
precedenti:
0 /usr/src
8 /cmd/aardvark.c
14 rmadillo.c
5 tmp/zoo

Output di frcode, con i null finali cambiati in newline e i byte di conteggio resi stampabili:
0 LOCATE02
0 /usr/src
8 /cmd/aardvark.c
6 rmadillo.c
−9 tmp/zoo

(6 = 14 − 8, e −9 = 5 − 14)

VEDERE ANCHE

find(1L), locate(1L), locatedb(5L), xargs(1L) Finding Files (Info in linea, o stampato)