Primeiro de tudo, grep
pesquisa no conteúdo dos arquivos, não procura nomes de arquivos. Para isso você quer find
. Ele não tem uma opção para definir o tamanho do nome do arquivo, mas você pode analisá-lo para obter o que deseja. Aqui estão alguns exemplos que eu executo em um diretório que contém os seguintes arquivos:
$ tree
.
├── a
├── ab
├── abc
├── abcd
└── dir
├── a
├── ab
├── abc
└── abcd
A busca por arquivos nesse diretório retorna:
$ find . -type f | sort
./a
./ab
./abc
./abcd
./dir/a
./dir/ab
./dir/abc
./dir/abcd
Portanto, para encontrar os arquivos com um comprimento X, precisaremos remover o caminho e corresponder apenas aos caracteres após o último /
:
$ find . -type f | grep -P '/.{3}$'
O sed
comando apenas remove o ./
. O -P
sinalizador ativa expressões regulares compatíveis com Perl, necessárias para o {n}
que é uma coisa PCRE e os $
meios "coincidem com o final da string".
Você também pode simplesmente fazer isso:
find . -type f | grep -P '/...$'
Isso é bom para pequenos números digitando 15 pontos para coincidir com nomes de arquivos com comprimento 15 não é muito eficiente.
Por fim, se você deseja ignorar a extensão e corresponder apenas ao nome do arquivo, faça o seguinte (como sugerido pelo @slm):
find . -type f | grep -P '/.{1}\.'
No entanto, isso também encontrará arquivos como a.bo.go
. É melhor se seus nomes de arquivos puderem conter mais de um .
:
find . -type f | grep -P '/.{1}\.[^.]+$'
NOTA: A solução acima pressupõe que você tenha nomes de arquivos relativamente sãos que não contenham novos caracteres de linha etc. Também será considerado não ignorar espaços nos nomes de arquivos ao calcular o comprimento que pode não ser o desejado. Se algum destes problemas for um problema, informe-me e atualizarei minha resposta.
a.go
é um nome de arquivo de comprimento 4.a
é um nome de arquivo de comprimento 1. Esse é o Unix, não o DOS, onde o nome e a extensão estavam separados e um implícito.
sempre fazia parte do nome do arquivo.