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.
- 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")
- Essa expansão resultante é uma lista de nomes de arquivos . que talvez seja muito longo ... Esta lista é passada para
locate
o máximo de argumentos de linha de comando individuais.
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)
- A
-r
opção diz para localizar para tratar seu argumento como um padrão de expressão regular.
- As aspas protegem o * do shell filename-expansion. Isso significa que o * e o ponto. agora são caracteres regex especiais
- 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\ regex
ou-/"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 -b
ou --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 updatedb
para atualizar o banco de dados do local ... (mas se você o adicionou recentemente, provavelmente sabe onde fica:) ....
locate
umaO(log(n))
pesquisa terminalocatedb
quando você faz uma consulta de pesquisa que não seja regex, você pode usargrep
o regex de para realizar umaO(m)
pesquisa nos sub-resultados já reduzidos. (n = número total de entradas emlocatedb
[todos os arquivos da sua unidade], m = número de entradas que correspondem menos ao seulocatedb
), complexidade total de execução:O(log(n)) + O(m)
onde m é, em médialog(n)
, o que você recebe2*O(log(n))
, ao contrário deO(n)
quando executa uma consulta regex sobre todas as entradas emlocatedb
.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?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
find
comando e nãolocate
para esse tipo de comportamento. A sintaxe seriafind 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 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.fonte
locate
(não requer nenhum outro utilitário comogrep
) e sem regexps (que são boas, mas desnecessárias neste caso).Para mim, o mais conveniente é
fonte