Respuestas:
ACTUALIZACIÓN : Una nota sobre el uso de la opción de expresión regular de ubicación frente a la expansión del nombre de archivo del shell en relación con los argumentos de ubicación ...
EXPANSIÓN DE SHELL FILENAME
Cuando escribe locate /bin/b*
(tenga en cuenta que no hay comillas), suceden varias cosas.
locate
tantos argumentos de línea de comando individuales. locate
luego prueba cada uno de estos argumentos con cada uno de los archivos de su base de datos y genera coincidencias. Sin embargo, tenga en cuenta que 'localizar' no tiene ningún concepto del directorio de trabajo actual. Solo hace coincidir sus argumentos con los nombres de archivos completamente calificados en su base de datos.
Esto significa que coincidirá con ambos /bin/bash
y /home/user/bin/brackets
tiene cierto grado de control de esta manera, pero la búsqueda de expresiones regulares de localizar ofrece más; al igual que otras opciones de ubicación.
OPCIÓN DE REGEXO DE LOCATE
Cuando escribe locate -r "/bin/b.*"
cosas diferentes suceden que con argumentos simples ... (los argumentos expandidos de shell son solo una lista de argumentos simples)
-r
opción le dice a localizar que trate su arg como un patrón de expresión regular. locate -r "^/bin/b.*"
produce nombres de archivo que comienzan con / bin / b ... eg2. locate -r ~/"bin/b.*"
produce nombres de archivo que comienzan con / home / user / bin / b .. Tenga en cuenta que ~ / no está protegido por "comillas" y, por lo tanto, está sujeto a la expansión tilde de shell que convierte ~ / en / home / user / Resumen: "expansión de nombre de archivo de shell" es bastante diferente a 'regex'
Ahora de vuelta a la publicación original:
locate
normalmente enumera la base de datos completa para stdout, por lo que para limitarla a un directorio en particular necesita filtrarla ... Puede hacerlo a través de las opciones de ubicación.
Puede usar la capacidad de expresión regular de localizar, en lugar de solo el glob de shell ... ( locate /dir/myfile*
es el glob de shell) ...
A partir de información localizar : -r
,--regex
nota: -i = ignorar mayúsculas
y minúsculas . . . . . -r = expresión regular
. . . . . ~ / será expandido por el shell a / home / user (cuando ~ / no está entre comillas)
. . . . . '\' (baskslash + espacio; sin comillas) es un espacio literal (para evitar la expansión del shell). Puede poner la cadena entre comillas, pero asegúrese de dejar el ~ / fuera de las comillas: ~/my\ regex
o-/"my regex"
p.ej. locate -ir ~/".*"la\ bella\ vita
es lo mismo locate -ir ~/".*la bella vita"
y buscará en todo su directorio de inicio "La Bella Vita" en cualquier lugar.
También puede limitar la búsqueda solo al nombre del archivo, pero usando -b
o --basename
... en cuyo caso, el inicio de línea de expresiones regulares se ^
aplica solo al nombre base ...
Con mayor frecuencia me encuentro usando locate -bir
PD ... Locate
es tan rápido que nunca he usado find
... ni he usado la búsqueda nautilus (demasiado lenta)
Con 'localizar', si está buscando algo que se acaba de agregar, simplemente ejecute sudo updatedb
para actualizar la base de datos de localizar ... (pero si lo ha agregado recientemente, probablemente sepa dónde está:) ...
Tuberéelo a través de grep, así
$ locate less | grep ^/bin
/bin/bzless
/bin/less
/bin/lessecho
/bin/lessfile
/bin/lesskey
/bin/lesspipe
/bin/zless
Editar: la otra respuesta es mejor, no sabía que puede pasar un patrón para localizar.
locate
realiza una O(log(n))
búsqueda locatedb
cuando le da una consulta de búsqueda sin expresión regular, puede usar grep
la expresión regular para realizar una O(m)
búsqueda en los subresultados ya reducidos. (n = número total de entradas en locatedb
[es decir, todos los archivos de su unidad], m = # de entradas que coinciden menos en su locatedb
), complejidad total de ejecución:, O(log(n)) + O(m)
donde m es en promedio log(n)
, por lo que obtiene 2*O(log(n))
, en lugar de O(n)
cuando realiza una consulta de expresiones regulares sobre todas las entradas en locatedb
.
O(log(n))
mientras que la búsqueda regex es O(n)
? La cantidad de entradas en db es la misma en cada caso. Supongo que es el algoritmo de búsqueda?
Puede usar locate /rootpath/*filenamespec
. No lo había probado antes, pero parece funcionar. Para hacer tu ejemplo, seríalocate /home/tim/science/*math*
Es posible que desee ver el find
comando en lugar de locate
ese tipo de comportamiento. La sintaxis sería find rootforsearch -name filenamepattern -print
. En este caso, su ejemplo requeriría. find /home/tim/science -name *math* -print
No tan rápido como localizar ya que no hay una base de datos para buscar ... en realidad busca el sistema de archivos. Hay muchas opciones que puede usar además de imprimir también, si tiene la intención de hacer algo con el archivo.
locate
sí misma (no requiere ninguna otra utilidad como grep
) y no tiene expresiones regulares (que son agradables, pero innecesarias en este caso).
Para mí lo más conveniente es
cd /home/tim/science
locate math | grep `pwd`