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