Eu acho que a razão pela qual você está esperando algo diferente do que está acontecendo é que você está tomando
[0-9]{n}
significa coincidir exatamente com n ocorrências de caracteres em [0-9] e descartar o resto, quando o que ele faz é encontrar n ocorrências de caracteres em [0-9] e chamá-lo de correspondência. Então, em
[0-9]{1}
ele encontra exatamente uma ocorrência de algo correspondente a [0-9], de modo que 1 corresponde a uma, em seguida, ao examinar a 22, ela para nas duas primeiras e considera uma correspondência sem olhar para o resto. Similarmente para o 333. Se você especificou
[0-9]{2}
não corresponderia a 1, mas a 22 correspondências e, em seguida, a 33 em 333 combinações.
Como disse o slm, limites de palavras são a passagem aqui. Você tem tanto o -P quanto o -E flavors do grep regex correspondentes em sua pergunta. Você pode usar o GNU \ < e \ > com -E assim:
ls | xargs -n 1 basename | grep -E '\<[0-9]{1}\>'
ou o \ b com o -E ou o pcre correspondente -P como este
ls | xargs -n 1 basename | grep -P '\b[0-9]{1}\b'