regex correspondente a "localizar"

8

Estou tentando usar o comando localizar para encontrar arquivos na minha pasta pessoal, no entanto, sempre que tento executar isso, não recebo resultados:

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

Eu também tentei, ^\/home\/jack\/^(?!\.)[A-Za-z0-9\/\ ]*(My.)*$mas isso não retorna resultados também.

O arquivo que estou procurando apenas para testá-lo é /home/jack/Music/Foals/My Number.flac

Gostaria de excluir os resultados de arquivos ocultos da minha pesquisa.

Jack Jones
fonte
2
Eu não estou familiarizado locate. Faz sentido combinar -b(ou seja, "Corresponder apenas o nome da base aos padrões especificados".) Com um caminho --regexp? Por que você escapa dos /?
Hauke ​​Laging
Desculpe eu estava usando um construtor de regex que é aconselhável I escapar esses personagens, e eu acho que você está certo sobre a bandeira -b, eu vou me livrar dele agora
Jack Jones
1
O que (My.)*deveria fazer? My.*$trabalho. Você tem que escapar ()nas ERs básicas.
Hauke ​​Laging
1
Você está usando um regex estendido. Mas --regexpleva um regex básico. Tente mudar --regexppara --regex(não p). A página de manual diz que --regexfaz correspondência estendida de regex.
Mikel

Respostas:

6

Isso parece fazer o trabalho.

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

Citações do manual:

-i, --ignore-case Ignora distinções de maiúsculas e minúsculas ao combinar padrões.

-r, --regexp REGEXP Pesquise um REGEXP básico do regexp. Nenhum padrão é permitido se esta opção for usada, mas essa opção pode ser especificada várias vezes.

Graeme
fonte
No Linux, mlocate 0.26-1ubuntu2 (Ubuntu 16.04 LTS Xenial Xerus, a partir de 05/02/2018), o comando retorna o seguinte erro "localizar: argumentos de não opção não são permitidos com --regexp". mlocate é o pacote real (/ usr / bin / location é um link simbólico para mlocate).
Hans Deragon
1

Como a localização funciona

O índice de arquivos que o locatecomando usa é reconstruído apenas uma vez por dia, normalmente. É construído por este trabalho cron /etc/cron.daily/mlocate,. Portanto, suas entradas provavelmente ainda não estão lá. Você pode executá-lo novamente se quiser reconstruir manualmente esses índices.

$ sudo /etc/cron.daily/mlocate

Usando find

No entanto, provavelmente você está melhor usando um comando como findpara localizar arquivos no diretório inicial.

$ 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 uma GUI

Você também pode estar interessado em uma ferramenta de pesquisa gráfica. Dê uma olhada nessas outras perguntas e respostas da U&L intituladas: GTK Frontend for Locate, que abrange uma dessas ferramentas chamada Catfish. Essa ferramenta também pode utilizar locatedados e findcomandos.

slm
fonte
1
Costumo encontrar locatemais rápido do que findmesmo se eu tiver que fazer o updatedbprimeiro. Enquanto o banco de dados já estiver razoavelmente atualizado, a maioria dos sistemas updatedbnão levará muito tempo. Encontrar sintaxe é provavelmente mais fácil neste caso.
Graeme
Sim, eu também o usei diariamente, é apenas em servidores nos quais estou escrevendo algo para o qual frequentemente mudarei find.
slm
Sim, deveria ter colocado 'a maioria dos sistemas de desktop'
Graeme
1

Você também pode adotar uma abordagem diferente:

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

Não tenho certeza do que você está tentando fazer. Você está usando a -ibandeira para torná-lo caso insensível e seu regex não é muito específico, você parece superior quer encontrar todos os arquivos ou pastas que estão sob /home/jacke que contêm MY, My, my, ou mYem qualquer lugar do nome do arquivo. Se sim, basta executar

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

Isso deve funcionar - corresponde apenas a arquivos e pastas não ocultos:

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

ainda mais simples - corresponde a arquivos que não possuem diretórios ocultos em nenhum lugar da árvore de diretórios. Provavelmente é isso que você deseja:

for f in /home/jack/**/*My.*
    do echo "$f" # or do any other command
done
jayhendren
fonte
Eu preferiria usar locate, pois estou tentando integrá-lo a uma GUI do Python para pesquisar enquanto você digita e é mais rápido. Mas obrigada mesmo assim!
Jack Jones
@JackJones, você nem precisa locateacelerar os resultados. Exemplo:echo /home/jack/**/*My.*
jayhendren