Utilice "localizar" en algún directorio específico?

46

Me preguntaba cómo restringir el rango de búsqueda de "localizar" a algún directorio.

Por ejemplo, ¿cómo encontrar archivos / directorios con la cadena "matemáticas" en sus nombres en algún directorio "/ home / tim / science /"?

¡Gracias y saludos!

Tim
fuente

Respuestas:

30

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.

  1. 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")
  2. Esta expansión resultante es una lista de nombres de archivo . lo cual es quizás muy largo ... Esta lista se pasa a locatetantos argumentos de línea de comando individuales.
  3. 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)

  1. La -ropción le dice a localizar que trate su arg como un patrón de expresión regular.
  2. Las comillas protegen el * del shell filename-expansion. Significa que el * y el punto. ahora son caracteres especiales de expresiones regulares
  3. 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\ regexo-/"my regex"

p.ej. locate -ir ~/".*"la\ bella\ vitaes 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 -bo --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 ... Locatees 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 updatedbpara actualizar la base de datos de localizar ... (pero si lo ha agregado recientemente, probablemente sepa dónde está:) ...

Peter.O
fuente
13

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.

Adam Byrtek
fuente
@ Adam ... No subestimes tu método; está bastante bien, pero puede usar la propia expresión regular de localizar en lugar de canalizar a grep ... El "otro" método al que hace referencia no usa expresión regular y se comporta de manera bastante diferente ... He agregado algunos detalles sobre las diferencias a mi respuesta ...
Peter.O
2
localizar menos | grep ^ / bin es mucho más rápido que localizar -r ^ / bin /.* less, porque localizar menos realizará una búsqueda eficiente de la palabra menos, y localizar -r realizará una operación de expresión regular en todas las entradas en ubicaciónb
Marcel Valdez Orozco
@MarcelValdezOrozco ¿Qué es "búsqueda eficiente de la palabra" y por qué es más rápido que la expresión regular?
Flashrunner
@Flashrunner Debido a que locaterealiza una O(log(n))búsqueda locatedbcuando le da una consulta de búsqueda sin expresión regular, puede usar grepla 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.
Marcel Valdez Orozco
@MarcelValdezOrozco Pero, ¿por qué la búsqueda no regex sobre db es 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?
Flashrunner
8

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 findcomando en lugar de locateese 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* -printNo 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.

Nerdfest
fuente
Esta es la mejor respuesta, ya que se utiliza a locatesí misma (no requiere ninguna otra utilidad como grep) y no tiene expresiones regulares (que son agradables, pero innecesarias en este caso).
Tom
Este funciona realmente como un encantamiento que puede usar localizar para buscar archivos en la ruta específica del directorio, gracias @Nerdfest
amit_game
1

Para mí lo más conveniente es

cd /home/tim/science
locate math | grep `pwd`
alex440
fuente
¿Realmente leíste la pregunta?
Tessaracter