Corresponde padrão de regex somente em filename.extension

1

Eu preciso usar find para localizar um arquivo que corresponda a um padrão de expressão regular em filename.extension em vez do padrão, que corresponde a /path/to/filename.extension .

Por exemplo:

/folder
  |--a-love-song.ogg
  |--a-jazz-song.ogg
  +--love-songs
       +--a-blues-song.ogg

E eu quero encontrar, em /folder e seus subdiretórios, arquivos com .*love.* no nome do arquivo:

debian@debian:~$ find folder -regex ".*love.*"
folder/a-love-song.ogg
folder/love-songs                   # Shouldn't be returned
folder/love-songs/a-blues-song.ogg  # Shouldn't be returned

Eu li a página do manual e percebo que há a opção -name , que pesquisa apenas o nome do arquivo, mas não parece permitir a regex e -name -regex não funciona.

Eu tentei usar o regex para ignorar o caminho:

debian@debian:~$ find folder -regex "\/.*love.*$"

Mas não retornou nada. É claro que ls | grep funcionaria, mas não retorna o caminho para o arquivo, que eu preciso para saber onde o arquivo está.

    
por Alex 15.04.2013 / 02:37

2 respostas

2

Você menciona que ls com grep funcionaria se você obtivesse o caminho completo para o arquivo, e quanto a find e grep ? Como grep retorna uma linha se uma correspondência for encontrada em qualquer lugar dessa linha, seu regex pode corresponder a algo que não tenha / s antes do nome do arquivo e ainda contenha sua string de pesquisa.

$ find folder | grep -i '[^/]*love[^/]*\.[a-z0-9]*'

Isso parece funcionar para mim. A correspondência de extensão pode ser reduzida se você souber que todas as extensões não têm números ou se você sabe que todos os arquivos que deseja corresponder têm uma extensão específica.

Exemplo de uso

$ find folder
folder
folder/a-love-song.ogg
folder/love-songs
folder/love-songs/a-blues-song.ogg
folder/love-songs/another-love-song.ogg
$ find folder | grep -i '[^/]*love[^/]*\.[a-z0-9]*'
folder/a-love-song.ogg
folder/love-songs/another-love-song.ogg

Tentativa de explicação do regex

  • [^/]* : corresponde a qualquer número de caracteres que não são /
  • love[^/]* : corresponde à string love e, em seguida, a qualquer número de caracteres que não são /
  • \.[a-z0-9]* : corresponde a . e, em seguida, a qualquer número de letras ou dígitos

Juntando, [^/]*love[^/]*\.[a-z0-9]* corresponde a tantos caracteres que não são / em ambos os lados de love com uma extensão anexada ao final. Dada a string a/love/path/love-file.ogg , a regex acima corresponde apenas a love-file.ogg . Se uma pasta de folhas contiver love , por exemplo: a/path/love-leaf , ela não corresponderá porque love-leaf não contém . seguido por letras ou números.

    
por 15.04.2013 / 03:12
0
find dir -regex '.*/[^/]*love[^/]*$'
    
por 15.04.2013 / 02:38