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 à stringlove
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.