Use “locate” em algum diretório específico?

36

Eu queria saber como restringir o intervalo de pesquisa de "locate" para algum diretório?

Por exemplo, como encontrar arquivos / diretórios com string "math" em seus nomes em algum diretório "/ home / tim / science /"?

Obrigado e cumprimentos!

    
por Tim 03.04.2011 / 14:53

3 respostas

19

UPDATE : Uma observação sobre o uso da opção regex do locate em relação ao Expansão do nome do arquivo em relação aos argumentos do locate ...

EXPANSÃO DA SHELL FILENAME
Quando você digita locate /bin/b* (note que não há cotações), várias coisas acontecem.

  1. Primeiro, shell filename-expansão expandirá o especial padrão de shell * (Isso ocorre porque o * está desprotegido, ou seja, não há "aspas duplas" )
  2. Essa expansão resultante é uma lista de nomes de arquivos . o que talvez seja muito longo ... Esta lista é passada para locate como muitos argumentos de linha de comando individuais.
  3. locate , em seguida, testa cada um desses argumentos em cada um dos arquivos em seu banco de dados e produz resultados correspondentes.

Observe, no entanto, que 'locate' não possui o conceito do diretório de trabalho atual. Ele só corresponde seus args contra os nomes de arquivos totalmente qualificados em seu banco de dados.
Isso significa que ele corresponderá a ambos os /bin/bash e /home/user/bin/brackets
Você tem algum grau de controle dessa maneira, mas a pesquisa regex do locate oferece mais; assim como algumas outras opções do locate.

OPÇÃO DE REGEX DO LOCAL
Quando você digita locate -r "/bin/b.*" , coisas diferentes acontecem do que com argumentos simples. ( shell-expand-args são apenas uma lista de argumentos simples)

  1. A opção -r informa locate para tratar seu argumento como um padrão regex.
  2. As aspas protegem o * da expansão do nome do arquivo shell. Isso significa que o * e o ponto. agora são caracteres regex especiais
  3. Sendo regex, é fácil dizer "locate" para corresponder a entrada do banco de dados de várias maneiras: por exemplo, 1. locate -r "^/bin/b.*" produz nomes de arquivos que começam com / bin / b ... eg2. locate -r ~/"bin/b.*" produz nomes de arquivos que começam com / home / user / bin / b . Observe que o ~ / não é não protegido por "aspas" e está, portanto, sujeito para shell til-expansion que converte ~ / em / home / user /

Resumo: "expansão de nome de shell" é bem diferente de "regex"

Agora, de volta à postagem original:

locate normalmente lista o banco de dados inteiro para stdout, portanto, para limitá-lo a um diretório específico, você precisa filtrá-lo ... Você pode fazer isso por meio das opções do locate.

Você pode usar o recurso de regex do locate, em vez de apenas globalização de shell ... ( locate /dir/myfile* é globalização de concha) ...

De info locate : -r , --regex

  • As correspondências "... (regex) são executadas em relação ao nome do caminho inteiro e, portanto, por padrão, um nome de caminho será correspondido se alguma parte corresponder à expressão regular especificada. A expressão regular pode usar ^ ou $ para ancorar uma correspondência no início ou no final de um nome de caminho. "

nota: -i = ignorar caso
. . . . . -r = regex
. . . . . ~ / será expandido pelo shell para / home / user (quando ~ / não está entre aspas)
. . . . . '\' (baskslash + space; sem aspas) é um espaço literal (para evitar a expansão do shell). Você pode colocar a string entre aspas, mas não se esqueça de deixar o ~ / fora das aspas: ~/my\ regex ou -/"my regex"

por exemplo. locate -ir ~/".*"la\ bella\ vita é o mesmo que locate -ir ~/".*la bella vita" e pesquisará todo o seu diretório pessoal para "La Bella Vita" ocorrendo em qualquer lugar.

Você também pode limitar a pesquisa apenas ao arquivo name , mas usando -b ou --basename . Nesse caso, o regex início-de-linha ^ se aplica somente a basename ...

Eu geralmente me encontro usando locate -bir

PS .. Locate é tão rápido, que eu tenho nunca usado find ... nem usei a pesquisa nautilus (muito lenta)

Com 'locate', se você estiver procurando por algo que foi adicionado recentemente, basta executar sudo updatedb para atualizar o banco de dados do locate ... (mas se você o adicionou recentemente, provavelmente sabe onde ele está :). ...

    
por Peter.O 03.04.2011 / 17:48
12

Pipe através do grep, como este

$ locate less | grep ^/bin
/bin/bzless
/bin/less
/bin/lessecho
/bin/lessfile
/bin/lesskey
/bin/lesspipe
/bin/zless

Edit: A outra resposta é melhor, eu não sabia que você pode passar um padrão para localizar.

    
por Adam Byrtek 03.04.2011 / 16:42
7

Você pode usar locate /rootpath/*filenamespec .Eu não tinha tentado antes, mas parece funcionar. Para fazer o seu exemplo, seria locate /home/tim/science/*math*

Você pode querer olhar para o comando find em vez de locate para esse tipo de comportamento. A sintaxe seria find rootforsearch -name filenamepattern -print . Nesse caso, seu exemplo exigiria find /home/tim/science -name *math* -print . Não tão rápido quanto localizar, pois não há banco de dados para pesquisar ... ele realmente procura no sistema de arquivos. Existem muitas opções que você pode usar além de imprimir também, se você pretende realmente fazer algo com o arquivo.

    
por Nerdfest 03.04.2011 / 15:03