Use "localizar" em algum diretório específico?

46

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

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

Obrigado e cumprimentos!

Tim
fonte

Respostas:

30

UPDATE : Uma observação sobre o uso da opção regex do Locate vs a expansão do nome de arquivo do shell em relação aos argumentos do local ...

EXPANSÃO DO ARQUIVO DO SHELL
Quando você digita locate /bin/b*(observe que não há aspas), várias coisas acontecem.

  1. Primeiro, a expansão de nome de arquivo do shell expandirá o caractere especial de 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 . que talvez seja muito longo ... Esta lista é passada para locateo máximo de argumentos de linha de comando individuais.
  3. locate então testa cada um desses argumentos em relação a cada um dos arquivos em seu banco de dados e produz correspondências.

Observe, no entanto, que 'localizar' não tem conceito do diretório de trabalho atual. Ele só combina seus argumentos com os nomes de arquivos totalmente qualificados em seu banco de dados.
Isso significa que ele corresponderá a ambos /bin/bash e /home/user/bin/brackets
você terá algum grau de controle dessa maneira, mas a pesquisa de expressões regulares do local oferece mais; assim como outras opções de localização.

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

  1. A -ropção diz para localizar para tratar seu argumento como um padrão de expressão regular.
  2. As aspas protegem o * do shell filename-expansion. Isso significa que o * e o ponto. agora são caracteres regex especiais
  3. Sendo regex, você pode facilmente dizer 'localizar' para corresponder à sua entrada no banco de dados de várias maneiras: eg1. locate -r "^/bin/b.*"produz nomes de arquivos começando com / bin / b ... eg2. locate -r ~/"bin/b.*"produz nomes de arquivos começando com / home / user / bin / b .. Observe que ~ / não é protegido por "aspas" e, portanto, está sujeito à expansão til do shell que converte ~ / em / home / user /

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

Agora, de volta à postagem original:


locate normalmente lista todo o banco de dados como stdout, para limitá-lo a um diretório específico, é necessário filtrá-lo ... Você pode fazer isso através das opções de localização.

Você pode usar a capacidade regex do local, em vez de apenas observar as conchas ... ( locate /dir/myfile* é observar as conchas) ...

De informações localizar : -r,--regex

  • "... (regex) correspondências são executadas com relação ao nome do caminho inteiro e, 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 fim de um nome de caminho ".

nota: -i = ignorar maiúsculas e minúsculas
. . . . . -r = regex
. . . . . ~ / será expandido pelo shell para / home / user (quando ~ / não estiver entre aspas)
. . . . . '\' (baskslash + space; sem aspas) é um espaço literal (para evitar a expansão do shell). Você pode colocar a sequência entre aspas, mas não deixe ~ / fora das aspas: ~/my\ regexou-/"my regex"

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

Você também pode limitar a pesquisa apenas ao nome do arquivo, mas usando o -bou --basename.. nesse caso, o início da linha ^de expressão regular se aplica apenas ao nome de base ...

Eu geralmente me vejo usando locate -bir

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

Com 'localizar', se você estiver procurando por algo que foi adicionado recentemente, basta executar sudo updatedbpara atualizar o banco de dados do local ... (mas se você o adicionou recentemente, provavelmente sabe onde fica:) ....

Peter.O
fonte
13

Passe pelo grep, assim

$ 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.

Adam Byrtek
fonte
@ Adam .. Não subestime seu método; está tudo bem, mas você pode usar o próprio regex do local em vez de canalizar para o grep. O método "other" ao qual você se refere não usa o regex e se comporta de maneira bastante diferente .... Adicionei alguns detalhes sobre as diferenças ao meu responder ...
Peter.O
2
localize menos | grep ^ / bin é muito mais rápido que localize -r ^ / bin /.* less, porque localize menos realizará uma pesquisa eficiente pela palavra menos e localize -r executará uma operação de regex em todas as entradas em localb
Marcel Valdez Orozco
@MarcelValdezOrozco O que é "pesquisa eficiente da palavra" e por que é mais rápida que a expressão regular?
Flashrunner
@Flashrunner Como locateuma O(log(n))pesquisa termina locatedbquando você faz uma consulta de pesquisa que não seja regex, você pode usar grepo regex de para realizar uma O(m)pesquisa nos sub-resultados já reduzidos. (n = número total de entradas em locatedb[todos os arquivos da sua unidade], m = número de entradas que correspondem menos ao seu locatedb), complexidade total de execução: O(log(n)) + O(m)onde m é, em média log(n), o que você recebe 2*O(log(n)), ao contrário de O(n)quando executa uma consulta regex sobre todas as entradas em locatedb.
Marcel Valdez Orozco
@MarcelValdezOrozco Mas por que a pesquisa não regex sobre db é O(log(n))enquanto a pesquisa regex é O(n)? A quantidade de entradas em db é a mesma em cada caso. Eu acho que é algoritmo de busca?
Flashrunner 14/02
8

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

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

Nerdfest
fonte
Esta é a melhor resposta, pois ela se usa locate(não requer nenhum outro utilitário como grep) e sem regexps (que são boas, mas desnecessárias neste caso).
Tom
Este funciona realmente como um encanto que você pode usar localizar para procurar arquivos no caminho do diretório específico, graças @Nerdfest
amit_game
1

Para mim, o mais conveniente é

cd /home/tim/science
locate math | grep `pwd`
alex440
fonte
Você realmente leu a pergunta?
Tessaracter