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.
- 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" )
- 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. -
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)
- A opção
-r
informa locate para tratar seu argumento como um padrão regex. - 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
- 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á :). ...