Você não precisa de canalização, grep ou ls . Basta usar o globo ocular.
Em bash , usando extglob pattern (deve ser habilitado por padrão em sessões interativas, se não usar shopt -s extglob para defini-lo primeiro):
file1@(|?|??)
? corresponde a qualquer caractere único, @(||) seleciona qualquer um dos padrões separados por | .
Se você quisesse apenas combinar os caracteres entre a-z e A-Z , use a classe de caractere [:alpha:] , que denota todos os caracteres alfabéticos na localidade atual:
file1@(|[[:alpha:]]|[[:alpha:]][[:alpha:]])
Exemplo:
$ ls -1
file1
file112
file11a
file12A2
file1a
file1ab
file1Ab
file1as
file2
fileadb
$ ls -1 file1@(|[[:alpha:]]|[[:alpha:]][[:alpha:]]))
file1
file1a
file1ab
file1Ab
file1as
zsh suporta isso nativamente:
file1(|[[:alpha:]]|[[:alpha:]][[:alpha:]])
Estou respondendo a essa parte com muita relutância, a pedido do OP.
Qualquer leitor futuro, não analise ls , use globbing.
Usando ls e grep :
ls | grep -E '^file1[[:alpha:]]{,2}$'
Exemplo:
% ls | grep -E '^file1[[:alpha:]]{,2}$'
file1
file1a
file1ab
file1Ab
file1as