Aqui está uma maneira simples de fazer isso que deve funcionar com o shell Bourne e seus descendentes (incluindo o bash e o ksh) , se você não se importar muito com o formato de saída exato:
$ for file in *; do if [ -f "$file" ] && [ -r "$file" ]; then wc -c "$file"; fi; done
23 HEAD
111 config
73 description
Se você também não se importa muito com erros e casos especiais (nesse caso, boa sorte para você):
$ for file in *; do wc -c $file; done
Notas:
-
Se você está escrevendo isso com bash ou ksh, provavelmente é melhor usar (( )) ou [[ ]] em vez de [ ] . ( fonte )
Além disso, considere usar $(wc -c <"$file") em vez de 'wc -c <"$file"' ). ( fonte )
-
-f testa para ver se o que você está vendo é um arquivo comum (não um diretório, dispositivo, canal, soquete, tty ou, geralmente, alguma coisa estranha que não pode ser dito ter um tamanho em bytes). -r testa que o arquivo é legível, ou seja, que wc tem uma chance de sucesso; Se você está olhando para arquivos ou arquivos enormes que você não pode ler, use stat de acordo com sua versão original e a resposta de Stéphane.
-
As aspas ( "$file" ) são necessárias se algum dos arquivos tiver espaços ou tabulações (por exemplo, um arquivo chamado my stuff.txt ).
-
Se você se preocupa com o formato exato, provavelmente deve usar alguma combinação de 'wc -c <"$file"' (que não imprime o nome do arquivo) e echo ou echo -n (que imprimirá o que quiser) ).
-
Se os arquivos de interesse forem argumentos para um script, use o script "$@" ( ).
Concordo com @ stéphane-chazelas que você não deve analisar a saída de ls ; mas se fizer isso, você não precisará da substituição do processo . Você pode simplesmente ler a saída do comando:
ls | while IFS= read -r blá blá blá
ou, se você quiser recorrer a um diretório:
find blá -type f -print | while IFS= read -r blá blá
ou melhor ainda:
find blá -type f print0 | xargs -o blá blá
onde -print0 e xargs -0 leram corretamente nomes de arquivos com espaços ou tabulações