table of contents
LOCATEDB(5L) | LOCATEDB(5L) |
NAZWA¶
locatedb - bazy nazw plików z kompresją początków
OPIS¶
Ta strona podręcznika opisuje format baz danych nazw plików dla locate w wersji GNU.
Bazy nazw plików zawierają listy plików, istniejących w szczególnych drzewach katalogów w momencie ostatniej aktualizacji baz.
Może istnieć wiele baz danych nazw plików. Użytkownicy mogą wybrać bazy, które przeszukuje locate, posługując się zmienną środowiskową lub opcją wiersza poleceń; zobacz locate(1L). Administrator systemu może wybrać częstość, z jaką aktualizowane są bazy, oraz katalogi, dla których zawierają zapisy. Normalnie bazy nazw plików zaktualizowane są przez okresowe uruchamianie programu updatedb, zwykle nocą; zobacz updatedb(1L).
updatedb uruchamia program o nazwie frcode kompresujący listę nazw plików przy użyciu front-compression [kompresji początków], redukującej rozmiar bazy danych 4 do 5-krotnie. Front-compression (znana również jako incremental encoding [kodowanie przyrostowe]) działa według następujących zasad.
Pozycje w bazie danych stanowią posortowaną listę (dla wygody użytkowników nie rozróżniającymi wielkości znaków). Ponieważ lista jest posortowana, prawdopodobnie każda z jej pozycji posiada wspólny przedrostek (łańcuch początkowy) z pozycją poprzednią. Każda pozycja bazy rozpoczyna się bajtem licznika różnicy offsetu. Jest to dodatkowa liczba znaków przedrostka pochodzącego z poprzedniej pozycji bazy, jaka powinna być zastosowana ponad liczbę znaków, jakiej używa poprzednia pozycja w stosunku do jej z kolei poprzednika. (Licznik ten może być ujemny.) Po liczniku następuje ograniczona znakiem null końcówka ASCII — część nazwy, która następuje po wspólnym przedrostku.
Jeśli licznik różnicy offsetu jest większy niż możliwy do przechowania w pojedynczym bajcie (+/-127), to bajt posiada wartość 0x80, a licznik następuje w słowie dwubajtowym, z bajtem starszym jako pierwszym (sieciowy porządek bajtów).
Każda baza danych rozpoczyna się od sztucznej pozycji dla pliku o nazwie `LOCATE02'. locate sprawdza ten zapis, by upewnić się, że plik bazy posiada poprawny format; ignoruje te pozycję podczas przeszukiwań.
Bazy danych nie mogą być sklejane (łączone), nawet jeśli ze wszystkich baz oprócz pierwszej usunięto pierwszą (sztuczną) pozycję. Wynika to stąd, że licznik różnicy offsetu pierwszego wpisu pochodzącego z drugiej i kolejnych baz będzie nieprawidłowy.
Istnieje również stary format bazy danych, używany przez uniksowe programy locate i find oraz ich wcześniejsze wydania GNU. W celu utworzenia baz w starym formacie updatedb uruchamia programy o nazwach bigram i code. Stary format różni się od powyższego opisu w następujący sposób. W nowym formacie każda z pozycji zaczyna się od licznika różnicy offsetu i kończy się bajtem null. W starym formacie wartości bajtu od 0 do 28 wskazują na licznik różnicy offsetu od -14 do 14. Wartością bajtu wskazującą, na to że występuje po niej długi licznik jest 0x1e (30), nie zaś 0x80. Długie liczniki przechowywane są w porządku bajtów hosta, który niekoniecznie jest sieciowym porządkiem bajtów, oraz o rozmiarze słowa integer hosta, zwykle mającym 4 znaki. One także reprezentują licznik o 14 mniejszy od ich wartości. Wiersze bazy danych nie posiadają bajtu ogranicznika; początek następnego wiersza wskazywany jest jego pierwszy bajt o wartości <= 30.
Poza tym, zamiast rozpoczynania się fikcyjną pozycją, stary format bazy danych rozpoczyna się od 256 bajtowej tablicy zawierającej 128 najczęściej występujących dwuznaków (bigram) w liście plików. Dwuznak w tym kontekście jest parą sąsiednich bajtów. Bajty w bazie danych posiadające ustawiony starszy bit są indeksami (z wyczyszczonym starszym bitem) do tablicy dwuznaków. Kodowanie dwuznaków i liczniki różnicy offsetu powodują, że bazy te są o 20-25% mniejsze w porównaniu z nowym formatem. Nie są jednak czysto 8-bitowe. Każdy z bajtów nazwy pliku, przypadający na zakres używany dla kodów specjalnych, zastępowany jest w bazie przez znak zapytania, co nieprzypadkowo stanowi maskę powłoki dopasowującą pojedynczy znak.
PRZYKŁAD¶
Dane wejściowe do frcode: /usr/src /usr/src/cmd/aardvark.c /usr/src/cmd/armadillo.c /usr/tmp/zoo Długość najdłuższego wspólnego przedrostka z poprzedniego zapisu: 0 /usr/src 8 /cmd/aardvark.c 14 rmadillo.c 5 tmp/zoo
Dane wynikowe z frcode, z końcowymi znakami null zamienionymi na znaki nowej linii i zmianie liczby bajtów na postać drukowalną:
0 LOCATE02 0 /usr/src 8 /cmd/aardvark.c 6 rmadillo.c -9 tmp/zoo (6 = 14 - 8, a -9 = 5 - 14)
ZOBACZ TAKŻE¶
find(1L), locate(1L), locatedb(5L),
xargs(1L).
Znajdowanie plików (dokumentacji Info on-line lub
drukowanej)