coincidencia de expresiones regulares con "localizar"


8

Estoy tratando de usar el comando de localización para encontrar archivos en mi carpeta de inicio, sin embargo, cada vez que intento ejecutar esto no obtengo resultados:

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

También lo he intentado, ^\/home\/jack\/^(?!\.)[A-Za-z0-9\/\ ]*(My.)*$pero eso tampoco devuelve resultados.

El archivo que estoy buscando solo para probarlo es /home/jack/Music/Foals/My Number.flac

Me gustaría excluir los resultados de los archivos ocultos de mi búsqueda.


2
No estoy familiarizado con locate. ¿Tiene sentido combinar -b(es decir, " Hacer coincidir solo el nombre base con los patrones especificados") con una ruta --regexp? ¿Por qué escapas del /s?
Hauke ​​Laging

Lo siento, estaba usando un generador de expresiones regulares que me aconsejó que escapara de esos personajes, y supongo que tienes razón sobre la bandera -b, lo eliminaré ahora
Jack Jones

1
¿Qué se (My.)*supone que debe hacer? My.*$trabajos. Tienes que escapar ()en REs básicos.
Hauke ​​Laging

1
Estás utilizando una expresión regular extendida. Pero --regexptoma una expresión regular básica. Intenta cambiar --regexpa --regex(no p). La página del manual dice que --regexsí coincide con la expresión regular de expresiones regulares.
Mikel

Respuestas:


6

Esto parece hacer el trabajo.

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

Citas del manual:

-i, --ignore-case Ignora las distinciones de mayúsculas y minúsculas cuando coinciden patrones

-r, --regexp REGEXP Busca un REGEXP regexp básico. No se permiten PATRONES si se usa esta opción, pero esta opción se puede especificar varias veces.


En Linux, mlocate 0.26-1ubuntu2 (Ubuntu 16.04 LTS Xenial Xerus, a partir del 2018-02-05), el comando devuelve el siguiente error "localizar: no se permiten argumentos sin opciones con --regexp". mlocate es el paquete real (/ usr / bin / Locate es un enlace simbólico a mlocate).
Hans Deragon

1

Cómo localizar funciona

El índice de archivos que locateusa el comando solo se reconstruye una vez al día, por lo general. Está construido por esta tarea cron, /etc/cron.daily/mlocate. Por lo tanto, es probable que sus entradas aún no estén allí. Puede volver a ejecutarlo si desea que reconstruya manualmente estos índices.

$ sudo /etc/cron.daily/mlocate

Usando find

Sin embargo, probablemente sea mejor usar un comando como findlocalizar archivos en su directorio de inicio.

$ 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

Usando una GUI

También podría estar interesado en una herramienta de búsqueda gráfica. Eche un vistazo a este otro U&L Q&A titulado: GTK Frontend para localizar qué cubre una de esas herramientas llamada Catfish. Esta herramienta puede utilizar tanto locatedatos como findcomandos también.


1
A menudo encuentro locatemás rápido que findincluso si tengo que hacer un updatedbprimero. Mientras la base de datos ya esté razonablemente actualizada en la mayoría de los sistemas updatedb, no tomará mucho tiempo. Sin embargo, encontrar la sintaxis es probablemente más fácil en este caso.
Graeme

Sí, también lo usé a diario, solo en servidores en los que escribo algo que a menudo cambiaré find.
slm

Sí, debería haber puesto 'la mayoría de los sistemas de escritorio'
Graeme

1

También podría adoptar un enfoque diferente:

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

No estoy seguro de lo que estás tratando de hacer. Estás usando la -ibandera para que sea sensible a mayúsculas y su expresión regular no es muy específica, pareces superior que desee encontrar todos los archivos o carpetas que están bajo /home/jacky que contienen MY, My, my, o mYen cualquier parte del nombre de archivo. Si es así, solo corre

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

0

Esto debería funcionar: solo coincide con archivos y carpetas no ocultos:

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

aún más simple: coincide con los archivos que no tienen directorios ocultos en ningún lugar del árbol de directorios. Probablemente esto es lo que quieres:

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

Preferiría usarlo locate, ya que estoy tratando de integrarlo en una interfaz gráfica de usuario de Python para buscar a medida que escribe y es más rápido. ¡Pero gracias de cualquier manera!
Jack Jones

@JackJones ni siquiera necesitas locateacelerar los resultados. Por ejemplo:echo /home/jack/**/*My.*
jayhendren
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.