regex correspondente a “locate”

7

Estou tentando usar o comando locate para localizar arquivos na minha pasta pessoal. No entanto, sempre que tento executar isso, não obtenho 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 também não há resultados.

O arquivo que estou procurando apenas para testar é /home/jack/Music/Foals/My Number.flac

Eu gostaria de excluir os resultados de arquivos ocultos da minha pesquisa.

    
por Jack Jones 25.02.2014 / 23:54

4 respostas

6

Isso parece fazer o trabalho.

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

Citações do manual:

-i, --ignore-case Ignore case distinctions when matching patterns.

-r, --regexp REGEXP Search for a basic regexp REGEXP. No PATTERNs are allowed if this option is used, but this option can be specified multiple times.

    
por 26.02.2014 / 00:39
1

Como o site funciona

O índice de arquivos que o comando locate usa só é reconstruído uma vez por dia, normalmente. É construído por esta tarefa cron, /etc/cron.daily/mlocate . Então, as entradas provavelmente não estão lá ainda. Você pode voltar a executá-lo se quiser reconstruir manualmente esses índices.

$ sudo /etc/cron.daily/mlocate

Usando o find

No entanto, é melhor você usar um comando como find para localizar arquivos em seu diretório pessoal.

$ 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. Veja este outro Perguntas e respostas intitulado: GTK Frontend para localizar , que abrange uma dessas ferramentas, chamada Catfish. Esta ferramenta pode utilizar os dados locate , bem como os comandos find .

    
por 26.02.2014 / 00:27
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 sinalização -i para torná-la insensível a maiúsculas e sua regex não é muito específica. Parece que deseja localizar todos os arquivos ou pastas que estão em /home/jack e que contêm MY , My , my ou mY em qualquer lugar no nome do arquivo. Se assim for, basta executar

locate -i my | grep '/home/jack' | grep -v '/\.'
    
por 26.02.2014 / 05:16
0

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

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

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

for f in /home/jack/**/*My.*
    do echo "$f" # or do any other command
done
    
por 26.02.2014 / 00:10