Risposte:
AGGIORNAMENTO : una nota sull'uso dell'opzione regex di Locate contro l' espansione del nome file della shell in relazione agli argomenti di Locate ...
ESPANSIONE DEL NOME DEL FILO SHELL
Quando digiti locate /bin/b*
(nota che non ci sono virgolette), accadono diverse cose.
locate
molti argomenti di riga di comando individuali. locate
quindi verifica ciascuno di questi argomenti rispetto a ciascuno dei file nel suo database e genera corrispondenze. Si noti, tuttavia, che "individuare" non ha il concetto della directory di lavoro corrente. Corrisponde solo ai tuoi argomenti con i nomi di file completi nel suo database.
Ciò significa che corrisponderà ad entrambi /bin/bash
e in /home/user/bin/brackets
questo modo avrai un certo controllo, ma la ricerca regex di Locate offre di più; così come altre opzioni di Locate.
OPZIONE REGICE DI LOCATE
Quando si digitano locate -r "/bin/b.*"
cose diverse accadono che fare con args semplici. ( Shell-extended-args sono solo un elenco di args semplici)
-r
opzione dice a individuare di trattare il tuo arg come un modello regex. locate -r "^/bin/b.*"
produce nomi di file che iniziano con / bin / b ... eg2. locate -r ~/"bin/b.*"
produce nomi di file che iniziano con / home / user / bin / b .. Notare che ~ / non è protetto da "virgolette" ed è quindi soggetto all'espansione tilde della shell che converte ~ / in / home / user / Riepilogo: "espansione del nome del file shell" è abbastanza diverso da "regex"
Ora torniamo al post originale:
locate
in genere elenca l'intero database su stdout, quindi per limitarlo a una particolare directory è necessario filtrarlo ... È possibile farlo tramite le opzioni di individuazione.
Puoi usare la funzionalità regex di Locate, piuttosto che solo il guscio della shell ... ( locate /dir/myfile*
è il guscio della shell) ...
Da informazioni individuare : -r
,--regex
nota: -i = ignora il caso
. . . . . -r = regex
. . . . . ~ / verrà espanso dalla shell in / home / user (quando ~ / non è tra virgolette)
. . . . . '\' (baskslash + spazio; senza virgolette) è uno spazio letterale (per evitare l'espansione della shell). Puoi mettere la stringa tra virgolette, ma assicurati di lasciare ~ / al di fuori delle virgolette: ~/my\ regex
o-/"my regex"
per esempio. locate -ir ~/".*"la\ bella\ vita
è lo stesso di locate -ir ~/".*la bella vita"
e cercherà "La Bella Vita" nella tua intera home directory.
Puoi anche limitare la ricerca al solo nome del file ma usando il tasto -b
o --basename
.. nel qual caso il regex start-of-line si ^
applica solo al nome base ...
Mi ritrovo più comunemente a usare locate -bir
PS .. Locate
è così veloce, che non ho mai usato find
... né ho usato la ricerca nautilus (troppo lento)
Con 'individuare', se stai cercando qualcosa che è stato appena aggiunto, esegui semplicemente sudo updatedb
per aggiornare il database di Locate ... (ma se l'hai appena aggiunto, probabilmente sai dove si trova:) ....
Inoltra attraverso grep, in questo modo
$ locate less | grep ^/bin
/bin/bzless
/bin/less
/bin/lessecho
/bin/lessfile
/bin/lesskey
/bin/lesspipe
/bin/zless
Modifica: l'altra risposta è migliore, non sapevo che puoi passare un modello per individuare.
locate
esegue una O(log(n))
ricerca locatedb
quando si esegue una query di ricerca non regex, è possibile utilizzare grep
regex per eseguire una O(m)
ricerca sui risultati secondari già ridotti. (n = numero totale di voci in locatedb
[cioè tutti i file del tuo disco], m = # di voci che corrispondono meno nel tuo locatedb
), complessità di esecuzione totale:, O(log(n)) + O(m)
dove m è in media log(n)
, quindi ottieni 2*O(log(n))
, al contrario di O(n)
quando ti esibisci una query regex su tutte le voci in locatedb
.
O(log(n))
mentre la ricerca regex è O(n)
? La quantità di voci in db è la stessa in ogni caso. Immagino sia un algoritmo di ricerca?
Puoi usarlo locate /rootpath/*filenamespec
. Non l'avevo mai provato prima, ma sembra funzionare. Per fare il tuo esempio, lo sarebbelocate /home/tim/science/*math*
Potresti voler guardare il find
comando piuttosto che locate
quel tipo di comportamento. La sintassi sarebbe find rootforsearch -name filenamepattern -print
. In questo caso, il tuo esempio richiederebbe. find /home/tim/science -name *math* -print
Non è veloce come individuare poiché non esiste un database da cercare ... in realtà cerca nel filesystem. Ci sono molte altre opzioni che puoi usare oltre a stampare, se hai intenzione di fare qualcosa con il file.
locate
se stessa (non richiede alcuna altra utilità come grep
) e fa senza regexps (che sono carini, ma non necessari in questo caso).
Per me il più conveniente è
cd /home/tim/science
locate math | grep `pwd`