regex corrispondente a "individuare"


8

Sto cercando di utilizzare il comando Locate per trovare i file nella mia cartella home, tuttavia ogni volta che provo ad eseguirlo non ottengo risultati:

locate -i -l 4 --regexp '^\/home\/jack\/[A-Za-z0-9\/\ ]*(My.)*$'

Ho anche provato, ^\/home\/jack\/^(?!\.)[A-Za-z0-9\/\ ]*(My.)*$ma anche questo non restituisce risultati.

Il file che sto cercando solo per testarlo è /home/jack/Music/Foals/My Number.flac

Vorrei escludere i risultati dei file nascosti dalla mia ricerca.


2
Non ho familiarità con locate. Ha senso combinare -b(cioè "Abbina solo il nome di base con i modelli specificati") con un percorso in --regexp? Perché fuggi dalla /s?
Hauke ​​Laging,

Mi dispiace che stavo usando un regex builder che mi ha consigliato di sfuggire a quei personaggi, e immagino che tu abbia ragione sulla bandiera -b, me ne libererò ora
Jack Jones,

1
Cosa (My.)*dovrebbe fare? My.*$lavori. Devi scappare ()in RE di base.
Hauke ​​Laging,

1
Stai usando una regex estesa. Ma --regexprichiede una regex di base. Prova a cambiare --regexpin --regex(no p). La pagina man dice --regexche abbina la regex estesa.
Mikel,

Risposte:


6

Questo sembra fare il lavoro.

locate -ir '^/home/jack/\([^.][^/]\+/\)\+My[^/]*$'

Citazioni dal manuale:

-i, --ignore-case Ignora le distinzioni tra maiuscole e minuscole quando si corrispondono modelli.

-r, --regexp REGEXP Cerca un regexp di base REGEXP. Non sono consentiti MOTIVI se si utilizza questa opzione, ma questa opzione può essere specificata più volte.


In Linux, mlocate 0.26-1ubuntu2 (Ubuntu 16.04 LTS Xenial Xerus, a partire dal 05-02-2018), il comando restituisce il seguente errore "individuare: argomenti non opzionali non sono consentiti con --regexp". mlocate è il pacchetto effettivo (/ usr / bin / Locate è un collegamento simbolico a mlocate).
Hans Deragon,

1

Come funziona la localizzazione

L'indice dei file che locateutilizza il comando viene ricostruito solo una volta al giorno, in genere. E 'costruito da questo lavoro cron, /etc/cron.daily/mlocate. Quindi è probabile che le voci non siano ancora presenti. Puoi rieseguirlo se desideri ricostruire manualmente questi indici.

$ sudo /etc/cron.daily/mlocate

Utilizzando find

Tuttavia probabilmente stai meglio usando un comando come findindividuare i file nella tua home directory.

$ find ~ -iname "[^.]*" | head -10
/home/saml
/home/saml/isql_issue.txt
/home/saml/bbbb
/home/saml/script_name.sh
/home/saml/go_figure_book
/home/saml/go_figure_book/readme.txt
/home/saml/go_figure_book/lstopo.txt
/home/saml/go_figure_book/who_breaks_out.bash
/home/saml/hdat2
/home/saml/hdat2/hdat2_v50.iso

Utilizzando una GUI

Potresti anche essere interessato a uno strumento di ricerca grafico. Dai un'occhiata a queste altre domande e risposte U&L intitolate: Frontend GTK per individuare quale copre uno di questi strumenti chiamato Catfish. Questo strumento può utilizzare sia i locatedati che i findcomandi.


1
Lo trovo spesso locatepiù veloce findanche se devo fare un updatedbprimo. Finché il database è già ragionevolmente aggiornato sulla maggior parte dei sistemi updatedbnon ci vorrà molto. In questo caso, tuttavia, trovare la sintassi è probabilmente più semplice.
Graeme,

Sì, l'ho usato anche ogni giorno, è solo sui server in cui sto scrivendo qualcosa a cui passerò spesso find.
slm

Sì, avrebbe dovuto mettere "la maggior parte dei sistemi desktop"
Graeme,

1

Potresti anche adottare un approccio diverso:

locate "My file" | grep '/home/jack' | grep -v '/\.'

Non sono sicuro di cosa stai cercando di fare. Si sta utilizzando la -ibandiera per renderlo case insensitive e la vostra espressione regolare non è molto specifico, ti sembra superiore desidera trovare tutti i file o le cartelle che sono sotto /home/jacke che contengono MY, My, my, o mYin qualsiasi parte del nome del file. Se è così, corri e basta

locate -i my | grep '/home/jack' | grep -v '/\.'

0

Questo dovrebbe funzionare - corrisponde solo a file e cartelle non nascosti:

find /home/jack -name "[^.]*My.*"

ancora più semplice: corrisponde a file che non hanno directory nascoste in nessun punto dell'albero della directory. Probabilmente questo è quello che vuoi:

for f in /home/jack/**/*My.*
    do echo "$f" # or do any other command
done

Preferirei usare locate, poiché sto cercando di integrarlo in una GUI di Python per cercare mentre digiti ed è più veloce. Ma grazie comunque!
Jack Jones,

@JackJones non hai nemmeno bisogno locatedi accelerare i risultati. Ad esempio:echo /home/jack/**/*My.*
Jayhendren,
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.