DESCRIPCIÓN
Esta página de manual documenta el formato de las bases de datos de nombres de fichero para la versión GNU de locate. La base de datos de nombres de fichero contiene listas de los ficheros que estaban en los árboles de directorios cuando se actualizaron la última vez las bases de datos.Puede haber múltiples bases de datos. Los usuarios pueden seleccionar en qué bases de datos busca locate usando una variable de entorno, o una opción de línea de comando; ver locate(1L). El administrador de sistema puede elegir el nombre de fichero de la base de datos por defecto, la frecuencia con que se actualizan las bases de datos, y los directorios para los que contienen entradas. Normalmente, las bases de datos de nombres de fichero se actualizan al ejecutar el programa updatedb periódicamente, típicamente de noche; ver updatedb(1L).
updatedb ejecuta un programa llamado frcode para comprimir la lista de nombres de fichero utilizando compresión de cabeceras, que reduce el tamaño de la base de datos por un factor de 4 a 5. La compresión de cabeceras (también conocida por codificación incremental) trabaja de la forma que se explica a continuación.
Las entradas de la base de datos son una lista ordenada (sin tener en cuenta mayúsculas y minúsculas, para conveniencia de los usuarios). Como la lista está ordenada, es probable que cada entrada comparta un prejijo (cadena de caracteres inicial) con la entrada anterior. Cada entrada de la base de datos comienza con un byte de diferencia de desplazamiento (offset-differential count byte), que es el número adicional de caracteres de prefijo de la entrada precedente a utilizar más allá del número que está utilizando la entrada precedente de su propio predecesor. (El número puede ser negativo). Tras el número queda un resto ASCII terminado en nulo --- la parte del nombre que sigue al prefijo compartido.
Si la cuenta diferencial de desplazamiento es mayor que el que puede guardarse en un byte (+/-127), el byte tiene el valor 0x80 y la cuenta sigue en una palabra de 2 bytes, con el byte alto primero (orden de byte de red).
Cada base de datos comienza con una entrada falsa a un fichero llamado `LOCATE02', que locate comprueba para asegurarse que el fichero de base de datos tiene el formato correcto; ignora la entrada al hacer la búsqueda.
Las bases de datos no pueden ser concatenadas juntas, aunque la primera entrada (falsa) se elimine de todas las bases de datos excepto la primera. Esto se debe a que las cuentas diferenciales en la primera entrada de la segunda y siguientes bases de datos serían incorrectas.
También hay un formato antiguo de base de datos, usado por los programas locate y find de Unix y versiones anteriores a las de GNU. updatedb ejecuta los programas llamados bigram y code para producir bases de datos en el formato antiguo. El formato antiguo difiere de la descripción de arriba de las siguientes maneras. En vez de que cada entrada empiece con un byte de cuenta diferencial de desplazamiento y termine con un nulo, los valores del byte de 0 a 28 indican cuentas diferenciales de desplazamiento de -14 a 14. El valor del byte que indica una cuenta de desplazamiento larga es 0x1e (30), no 0x80. Las cuentas largas se almacenan en el orden de byte de host, que no es necesariamente el orden de byte de red, y con tamaño de palabra de entero de host, que normalmente son 4 bytes. También representan una cuenta inferior en 14 a su valor. Las líneas de la base de datos no tienen byte de terminación; el comienzo de la siguiente línea está indicado por su primer byte con valor <= 30.
Además, en vez de comenzar con una entrada falsa, el formato antiguo de base de datos comienza con una tabla de 256 bytes que contiene los 128 bigramas más comunes en la lista de ficheros. Un bigrama es un par de bytes adyacentes. Los bytes de la base de datos que tienen el bit alto a 1 son índices (con el bit alto borrado) a la tabla de bigramas. La codificación de bigramas y cuentas diferenciales de desplazamiento hace estas bases de datos 20-25% más pequeñas que el nuevo formato, pero hace que no tengan el bit 8 limpio. Cualquier byte de un nombre de fichero que esté en los rangos usados para los códigos especiales es reemplazado en la base de datos por una interrogación, que no es por coincidencia el comodín de la shell para sustituír un carácter cualquiera.
EJEMPLO
Entrada a frcode: /usr/src /usr/src/cmd/aardvark.c /usr/src/cmd/armadillo.c /usr/tmp/zoo Longitud del prefijo más largo a compartir de la entrada precedente: 0 /usr/src 8 /cmd/aardvark.c 14 rmadillo.c 5 tmp/zooSalida a frcode, con nulos al final cambiados a saltos de línea y bytes de cuenta hechos imprimibles:
0 LOCATE02 0 /usr/src 8 /cmd/aardvark.c 6 rmadillo.c -9 tmp/zoo (6 = 14 - 8, y -9 = 5 - 14)