234 votes

Additionner une colonne de nombres au shell Unix

Étant donné une liste de fichiers dans files.txt je peux obtenir une liste de leurs tailles comme ceci :

cat files.txt | xargs ls -l | cut -c 23-30

ce qui donne quelque chose comme ceci :

  151552
  319488
 1536000
  225280

Comment puis-je obtenir le total de tous ces chiffres ?

443voto

Todd Owen Points 4477
... | paste -sd+ - | bc

est la plus courte que j'ai trouvée (de la part du Ligne de commande UNIX blog).

Edit : a ajouté le - argument pour la portabilité, merci @Dogbert et @Owen.

0 votes

Nice. J'ai besoin de la dernière - sur Solaris aussi

9 votes

alias sum="paste -sd+ - | bc" ajouté à l'achèvement du shell, merci mon pote

0 votes

. . .| x=$(echo <(cat)); echo $((0+${x// /+}+0)) si tu veux tout casser tout le temps :

170voto

Greg Reynolds Points 3675

C'est parti.

cat files.txt | xargs ls -l | cut -c 23-30 | 
  awk '{total = total + $1}END{print total}'

39 votes

L'utilisation de l'awk est une bonne idée, mais pourquoi garder l'option cut ? C'est un numéro de colonne prévisible, donc utilisez ... | xargs ls -l | awk '{total = total + $5}{END{print total}'

3 votes

Vous avez raison bien sûr - il était plus facile d'ajouter à la fin de ce qui était déjà là :-)

3 votes

Une parenthèse de trop dans la réponse de @dmckee :)

11voto

ALL Points 43

Cat ne fonctionnera pas s'il y a des espaces dans les noms de fichiers. voici une ligne unique en perl à la place.

perl -nle 'chomp; $x+=(stat($_))[7]; END{print $x}' files.txt

11voto

Barun Points 831

Au lieu d'utiliser couper pour obtenir la taille du fichier à partir de la sortie de ls -l vous pouvez l'utiliser directement :

$ cat files.txt | xargs ls -l | awk '{total += $5} END {print "Total:", total, "bytes"}'

Awk interprète "$5" comme la cinquième colonne. C'est la colonne de ls -l qui vous donne la taille du fichier.

3voto

Sanjaya R Points 2280

En ksh :

echo " 0 $(ls -l $(<files.txt) | awk '{print $5}' | tr '\n' '+') 0" | bc

1 votes

C'est une bonne chose pour récupérer le fait de sauter le cut mais vous ignorez la capacité d'awks à faire le calcul...

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X