Dada uma lista de arquivos files.txt
, posso obter uma lista de seus tamanhos assim:
cat files.txt | xargs ls -l | cut -c 23-30
que produz algo parecido com isto:
151552
319488
1536000
225280
Como posso obter o total de todos esses números?
alias sum="paste -sd+ - | bc"
adicionado à conclusão do shell, obrigado mate. . .| x=$(echo <(cat)); echo $((0+${x// /+}+0))
se você quer bash o tempo todo:/usr/bin/sum
bc
não está disponível em alguns sistemas!awk
, por outro lado, é (acredito) necessário para a conformidade com POSIX.Aqui vai
fonte
cut
? Isso é um número de coluna previsível, então uso... | xargs ls -l | awk '{total = total + $5}{END{print total}'
total+=$1
vez detotal = total + $1
Em vez de usar cut para obter o tamanho do arquivo da saída de ls -l , você pode usar diretamente:
O Awk interpreta "$ 5" como a quinta coluna. Esta é a coluna de ls -l que fornece o tamanho do arquivo.
fonte
O gato não funcionará se houver espaços nos nomes de arquivos. aqui está um one-liner perl.
fonte
Ou, se você quiser somar os números, insira:
fonte
... | python -c'import sys; print(sum(int(x) for x in sys.stdin))'
quando o python 2 desaparecer no final deste ano.TMTWWTDI : Perl tem um operador de tamanho de arquivo (-s)
fonte
Todo o ls -l e depois o corte são bastante complicados quando você tem stat . Também é vulnerável ao formato exato de ls -l (não funcionou até eu alterar os números das colunas para cortar )
Além disso, foi corrigido o uso inútil do gato .
fonte
<infile command
o mesmo (e em uma ordem melhor que)command <infile
.se você não tiver o bc instalado, tente
ao invés de
$( )
<- retorna o valor da execução do comando$(( 1+2 ))
<- retorna os resultados avaliadosecho
<- faça eco na telafonte
Você pode usar o seguinte script se desejar apenas usar scripts de shell sem awk ou outros intérpretes:
fonte
Eu usaria "du" em vez disso.
Se você quer apenas o número:
fonte
files.txt
for grande. Se o número de argumentos canalizados paraxargs
atingir determinado limite, ele será dividido em várias chamadas paradu
. O total mostrado no final é o total da última chamadadu
, não da lista inteira.Em ksh:
fonte
cut
, mas você ignorar awks capacidade de fazer as contas ...Pipe to gawk:
fonte
Aqui está o meu
fonte
fonte
Eu gosto de usar ....
eles mostrarão a soma de cada linha ...
aplicando sobre esta situação:
Total é o último valor ...
fonte
Você pode usar o awk para fazer o mesmo, até pula os não inteiros
ou você pode usar o comando ls e calcular a saída legível por humanos
fonte
awk '{ total += $1} END {print total}' files.txt
é mais rápidoNa minha opinião, a solução mais simples para isso é o comando unex "expr":
fonte
Pure bash
fonte
Ou você pode somar ao ler os tamanhos
Se você não se importa com tamanhos e blocos de mordida, tudo bem.
fonte
Se você possui R, pode usar:
Como me sinto confortável com o R, na verdade tenho vários aliases para coisas assim, para que eu possa usá-los
bash
sem precisar me lembrar dessa sintaxe. Por exemplo:o que eu vou fazer
Inspiração: Existe uma maneira de obter o mínimo, o máximo, a mediana e a média de uma lista de números em um único comando?
fonte