Utilizzare "individuare" in una directory specifica?


46

Mi chiedevo come limitare l'intervallo di ricerca di "individuare" ad alcune directory?

Ad esempio, come trovare file / directory con la stringa "matematica" nei loro nomi in una directory "/ home / tim / science /"?

Grazie e saluti!

Risposte:


30

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.

  1. Innanzitutto, l' espansione del nome file della shell espanderà il carattere speciale del modello di shell * (Questo perché * non è protetto, ovvero non ci sono "virgolette doppie")
  2. Questa espansione risultante è un elenco di nomi di file . che forse è molto lungo ... Questo elenco viene passato a locatemolti argomenti di riga di comando individuali.
  3. 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)

  1. L' -ropzione dice a individuare di trattare il tuo arg come un modello regex.
  2. Le virgolette proteggono * dall'espansione del nome file della shell. Significa che * e il punto. ora sono speciali personaggi regex
  3. Essendo regex, puoi facilmente dire 'individuare' per abbinare la sua voce di database in vari modi: eg1. 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

  • "... (regex) le corrispondenze vengono eseguite su tutto il nome del percorso, quindi per impostazione predefinita verrà associato un nome percorso se una parte di esso corrisponde all'espressione regolare specificata. L'espressione regolare può utilizzare ^ o $ per ancorare una corrispondenza al inizio o fine di un percorso ".

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\ regexo-/"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 -bo --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 updatedbper aggiornare il database di Locate ... (ma se l'hai appena aggiunto, probabilmente sai dove si trova:) ....


13

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.


@Adam .. Non sottovalutare il tuo metodo; va bene, ma puoi usare la regex di Locate invece di eseguire il piping per grep .. L'altro metodo a cui ti riferisci non usa regex e si comporta in modo molto diverso .... Ho aggiunto alcuni dettagli sulle differenze al mio risposta ...
Peter.O

2
individuare meno | grep ^ / bin è molto più veloce di individuare -r ^ / bin /.* in meno, perché localizza meno eseguirà una ricerca efficiente della parola meno, e individua -r eseguirà un'operazione regex su tutte le voci in locatedb
Marcel Valdez Orozco

@MarcelValdezOrozco Che cos'è la "ricerca efficiente della parola" e perché è più veloce di regex?
Flashrunner,

@Flashrunner Perché locateesegue una O(log(n))ricerca locatedbquando si esegue una query di ricerca non regex, è possibile utilizzare grepregex 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.
Marcel Valdez Orozco,

@MarcelValdezOrozco Ma perché la ricerca non regex su db è 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?
Flashrunner,

8

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 findcomando piuttosto che locatequel tipo di comportamento. La sintassi sarebbe find rootforsearch -name filenamepattern -print. In questo caso, il tuo esempio richiederebbe. find /home/tim/science -name *math* -printNon è 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.


Questa è la risposta migliore in quanto utilizza locatese stessa (non richiede alcuna altra utilità come grep) e fa senza regexps (che sono carini, ma non necessari in questo caso).
Tom,

Questo funziona davvero come un incantesimo che puoi usare individuare per cercare file nella directory specifica Path, grazie @Nerdfest
amit_game

1

Per me il più conveniente è

cd /home/tim/science
locate math | grep `pwd`

Hai davvero letto la domanda?
Tessaracter,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.