A principal razão é porque o comando echo leva x número de caracteres da variável e preenche 14 espaços. Isso significa que o número total de caracteres no espaço da string de saída não será consistente.
Em vez disso, convém usar printf com o especificador de largura %-10s para o preenchimento à esquerda, desta forma:
bash-4.3$ for i in "${a[@]}"; do printf "%-10s%-4s|\n" "${i:0:10}" " "; done
1.wav |
2.wav |
3.wav |
input.txt |
Desta forma, qualquer variável que você tiver será feita para caber dentro de 10 caracteres, e para esses 10 caracteres, nós preencheremos 4. - sign deixa cada string justificada.
O número -10 in %-10s deve permanecer o mesmo para garantir que, mesmo que o arquivo tenha menos de 10 caracteres, ainda recebamos uma cadeia de 10 caracteres com espaços preenchidos. Mas %-4s part pode ser variado. Por exemplo, no exemplo acima, %-4s terá 4 espaços lá, mas se quisermos ter 14 espaços, use %-14s .
Observe que geralmente é recomendado contra a análise de saída de ls , que é exatamente o que você está fazendo. Como alternativa, podemos usar o comando find com while IFS= read -r -d '' estrutura assim:
bash-4.3$ find -maxdepth 1 -type f -print0 | while IFS= read -r -d '' file;
> do
> printf "%-10s%-4s|\n" "${file:0:10}" " "
> done
./3.wav |
./1.wav |
./2.wav |
./.swp |
./input.tx |
Observe que find é recursivo, por isso também funciona em subdiretórios. Se você quiser evitar isso, use a opção -maxdepth 1 .