Étant donné une liste de fichiers files.txt
, je peux obtenir une liste de leurs tailles comme ceci:
cat files.txt | xargs ls -l | cut -c 23-30
qui produit quelque chose comme ça:
151552
319488
1536000
225280
Comment puis-je obtenir le total de tous ces chiffres?
alias sum="paste -sd+ - | bc"
ajouté à l'achèvement du shell, merci mate. . .| x=$(echo <(cat)); echo $((0+${x// /+}+0))
si vous voulez tout bash tout le temps:/usr/bin/sum
bc
n'est pas disponible sur certains systèmes!awk
, d'autre part est (je crois) requis pour la conformité POSIX.Voici
la source
cut
? C'est un numéro de colonne prévisible, alors utilisez... | xargs ls -l | awk '{total = total + $5}{END{print total}'
total+=$1
place detotal = total + $1
Au lieu d'utiliser cut pour obtenir la taille du fichier à partir de la sortie de ls -l , vous pouvez utiliser directement:
Awk interprète "$ 5" comme cinquième colonne. Il s'agit de la colonne de ls -l qui vous donne la taille du fichier.
la source
cat ne fonctionnera pas s'il y a des espaces dans les noms de fichiers. voici un perl one-liner à la place.
la source
Ou si vous voulez simplement additionner les chiffres, dirigez-vous vers:
la source
... | python -c'import sys; print(sum(int(x) for x in sys.stdin))'
lorsque python 2 disparaît à la fin de cette année.TMTWWTDI : Perl a un opérateur de taille de fichier (-s)
la source
L'ensemble ls -l puis cut est plutôt alambiqué quand on a stat . Il est également vulnérable au format exact de ls -l (cela n'a pas fonctionné jusqu'à ce que j'ai changé les numéros de colonne pour couper )
En outre, fixe l' utilisation inutile de chat .
la source
<infile command
la même chose (et dans un meilleur ordre que)command <infile
.si vous n'avez pas installé bc, essayez
au lieu de
$( )
<- retourne la valeur de l'exécution de la commande$(( 1+2 ))
<- retourne les résultats évaluésecho
<- l'écho à l'écranla source
Vous pouvez utiliser le script suivant si vous souhaitez simplement utiliser des scripts shell sans awk ou d'autres interprètes:
la source
J'utiliserais plutôt "du".
Si vous voulez juste le numéro:
la source
files.txt
est grand. Si le nombre d'arguments canalisés pourxargs
atteindre un certain seuil, il les décompose sur plusieurs appels àdu
. Le total affiché à la fin est le total pour le dernier appel àdu
, pas la liste entière.Dans ksh:
la source
cut
, mais vous ignorez la capacité des awks à faire le calcul ...Pipe à gawk:
la source
Voici la mienne
la source
la source
J'aime utiliser ....
ils montreront la somme de chaque ligne ...
appliquer sur cette situation:
Le total est la dernière valeur ...
la source
Vous pouvez utiliser le awk pour faire de même, il ignore même les non entiers
ou vous pouvez utiliser la commande ls et calculer la sortie lisible par l'homme
la source
awk '{ total += $1} END {print total}' files.txt
c'est plus rapideÀ mon avis, la solution la plus simple est la commande unix "expr":
la source
Pure bash
la source
Ou vous pouvez simplement les additionner en lisant les tailles
Si vous ne vous souciez pas de la taille des bouchées et des blocs, c'est bien, alors
la source
Si vous avez R, vous pouvez utiliser:
Comme je suis à l'aise avec R, j'ai en fait plusieurs alias pour des choses comme ça, donc je peux les utiliser
bash
sans avoir à me souvenir de cette syntaxe. Par exemple:qui me laisse faire
Inspiration: Existe - t-il un moyen d'obtenir le minimum, le maximum, la médiane et la moyenne d'une liste de nombres en une seule commande?
la source