tente
ls -1 | grep -E '^[A-Z]?([a-z][A-Z])*[a-z]?$'
EDIT: como apontado corretamente pelo @mikeserv, isso não funcionará para caracteres não-ASCII. E, de fato, acontecem com bastante frequência (por exemplo, arquivos de música com títulos estrangeiros para nome de arquivo). Então, a maneira mais robusta é:
ls -1 | grep -E '^[[:upper:]]?([[:lower:]][[:upper:]])*[[:lower:]]?$'
A seguir, mantenho apenas [A-Z]
para facilitar a leitura.
Além disso, uma advertência: isso corresponderá a um único caractere (superior ou inferior). Pode-se argumentar que "caso alternado" é definido por nenhum caso similar sucessivo em uma seqüência de zero ou mais caracteres ...: -)
Teste:
mkdir -p /tmp/junk
cd /tmp/junk
touch aAbBaBbA bAbBaA bbAb AAaBbAa BBBaaa aBaB
ls -1 | grep -E '^[A-Z]?([a-z][A-Z])*[a-z]?$'
# aAbBaBbA
# aBaB
# bAbBaA
Mas isso não é suficiente. Mais alguns testes:
touch aB
touch aBcD
touch aBcDeF
touch aBcDEf
touch Ab
touch AbCd
touch AbCdEf
touch AbCdeF
touch AbCdEF
ls -1 | grep -E '^[A-Z]?([a-z][A-Z])*[a-z]?$'
# aAbBaBbA
# aB
# Ab
# aBaB
# aBcD
# AbCd
# aBcDeF
# AbCdEf
# bAbBaA