Você não está dando nenhum argumento (nome de arquivo) para stat que levou a esse erro.
Você está usando a variável file para armazenar cada nome de arquivo e fazer um loop sobre eles, mas você não está dando os nomes de arquivos como argumentos para stat . Em suma, você precisa passar $file (o valor da variável file ) para stat .
Você também pode fazer tudo o que estiver fazendo em uma linha:
for file in .* *; do stat -c '%s-%n' "$file" ; done
Se você insistir na saída formatada com printf , precisará de um \n extra:
for file in .* *; do stat --printf='%s-%n\n' "$file" ; done
Aqui eu também adicionei %n para que você possa saber qual o tamanho do arquivo que está sendo mostrado.
EDITAR:
Se você deseja executar isso apenas em arquivos, excluindo diretórios, é necessário usar uma verificação adicional. Aqui eu usei test ( [ ) embutido para verificar se file é um arquivo regular, se assim for [ -f "$file" ] retorna o código de saída 0 então ( && ) executa stat no arquivo:
for file in .* *; do [ -f "$file" ] && stat -c '%s-%n' "$file" ; done