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.
- Primero, la expansión de nombre de archivo de shell expandirá el carácter de patrón de shell especial * (Esto se debe a que el * no está protegido, es decir, no hay "comillas dobles")
- Esta expansión resultante es una lista de nombres de archivo . lo cual es quizás muy largo ... Esta lista se pasa a
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)
- La
-r
opción le dice a localizar que trate su arg como un patrón de expresión regular.
- Las comillas protegen el * del shell filename-expansion. Significa que el * y el punto. ahora son caracteres especiales de expresiones regulares
- Al ser regex, puede decirle fácilmente a 'localizar' que coincida con su entrada de la base de datos de varias maneras: por ejemplo, 1.
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
- "... las coincidencias (regex) se realizan con el nombre completo de la ruta, por lo que, de manera predeterminada, un nombre de ruta coincidirá si alguna parte coincide con la expresión regular especificada. La expresión regular puede usar ^ o $ para anclar una coincidencia en el principio o final de un nombre de ruta ".
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á:) ...
locate
realiza unaO(log(n))
búsquedalocatedb
cuando le da una consulta de búsqueda sin expresión regular, puede usargrep
la expresión regular para realizar unaO(m)
búsqueda en los subresultados ya reducidos. (n = número total de entradas enlocatedb
[es decir, todos los archivos de su unidad], m = # de entradas que coinciden menos en sulocatedb
), complejidad total de ejecución:,O(log(n)) + O(m)
donde m es en promediolog(n)
, por lo que obtiene2*O(log(n))
, en lugar deO(n)
cuando realiza una consulta de expresiones regulares sobre todas las entradas enlocatedb
.O(log(n))
mientras que la búsqueda regex esO(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 delocate
ese tipo de comportamiento. La sintaxis seríafind 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.fuente
locate
sí misma (no requiere ninguna otra utilidad comogrep
) y no tiene expresiones regulares (que son agradables, pero innecesarias en este caso).Para mí lo más conveniente es
fuente