Existe-t-il un moyen de résumer la taille des fichiers répertoriés?


20

Voici la commande que j'utilise pour répertorier certains fichiers:

find . -name \*.extract.sys -size +1000000c -exec ls -lrt {} \;
-rw-r--r--   1 qa1wrk15   test       1265190 Sep 29 01:14 ./var/can/projs/ar/rep/extract/Sep/29/ar.ARAB-PI_7.20110929.extract.sys
-rw-r--r--   1 qa1wrk15   test       1345554 Sep 29 01:14 ./var/can/projs/ar/rep/extract/Sep/29/ar.ARAB-PI_2.20110929.extract.sys
-rw-r--r--   1 qa1wrk15   test       1370532 Sep 29 01:14 ./var/can/projs/ar/rep/extract/Sep/29/ar.ARAB-PI_3.20110929.extract.sys
-rw-r--r--   1 qa1wrk15   test       1399854 Sep 29 01:14 ./var/can/projs/ar/rep/extract/Sep/29/ar.ARAB-PI_8.20110929.extract.sys

etc.

Maintenant, je veux calculer la taille totale de ces fichiers en résumant la 5e colonne. J'ai pensé à utiliser awk, pour ce faire, j'ai donc testé ce qui suit dans un répertoire particulier

>ls -lrt | awk `{ print $1 }`
ksh: syntax error at line 1 : `{' unmatched

Je ne comprends pas quel est le problème, pourquoi cette erreur de syntaxe .

Je pense essayer

ls -lrt | awk `BEGIN {total = 0} {for(i=0;i<NR;i++){total+=$5}} END {printf "%d",total} 

cela aussi, mais un simple awkscript ne fonctionne pas.

Veuillez me suggérer ou corriger si je me trompe, ou s'il existe une solution à ce problème.

Réponses:


26

Tout d'abord, vous devez utiliser des guillemets simples ( '), pas les guillemets inclinés ( `).

Le awkscript en ligne pourrait être le suivant:

ls -lrt | awk '{ total += $5 }; END { print total }'

ainsi, pas besoin d'initialiser total(l' awkinitialise à zéro), et pas besoin de boucler, awkexécute déjà le script sur chaque ligne d'entrée.


1
En résumé, le one-liner serait le suivant: find . -name \*.extract.sys -size +1000000c -exec ls -lrt {} \; | awk '{ total += $5 }; END { print total }'
helt


16

@enzotib a déjà souligné quelle est votre erreur de syntaxe - je vais partir sur une petite tangente.

La sommation d'une colonne de chiffres est l'une de ces choses qui ne cessent d'apparaître. Je me suis retrouvé avec cette fonction shell:

sumcol() 
{ 
    awk "{sum+=\$$1} END {print sum}"
}

Avec cela, votre solution devient:

ls -lrt | sumcol 5

Cela résumera les chiffres de la colonne 5 et imprimera la valeur.


En effet, je me demandais pourquoi il n'y a pas d'utilitaire standard pour cela.
enzotib

Va droit dans mon .aliasesdossier.
Konrad Rudolph

14

Voici une autre façon de procéder en utilisant du:

find . -name \*.extract.sys -size +1000000c -print0 | du -c --files0-from=- | awk 'END{print $1}'

1
Excellente utilisation de du. Bel exemple. Comme avantage supplémentaire, vous pouvez ajouter l'option "-h" à du afin d'obtenir la sortie en Gig. Ensuite, vous n'avez pas à compter les chiffres et autres. Je viens de lancer un test sur un tas de fichiers d'une taille d'environ 1188800 kilo-octets. Quelle est sa taille? Peu importe, du -ch --files0-from=-me dit que mon total est "9.0G". Sweeeet!
Mike S

Doux, excellent usage de du!
haridsv

Aussi, si vous n'êtes intéressé que par le total, alors pipe du output to tail -1.
haridsv

4

Dans le cas où HP-UX a findégalement une -printfoption, il serait utile de composer une formule pour bccalculer:

( find . -name \*.extract.sys -size +1000000c -printf '%s+'; echo 0 ) | bc

Si la formule devient trop grande, elle peut être calculée étape par étape:

( find . -name \*.extract.sys -size +1000000c -printf 's+=%s\n'; echo s ) | bc

1

Avec GNU find:

find -name '*.extract.sys' -size +1000000c -printf '%s\n' | jq -s add

Avec GNU stat:

find . -name '*.extract.sys' -size +1000000c -exec stat -c%s '{}' + | jq -s add

Avec BSD stat:

find . -name '*.extract.sys' -size +1000000c -exec stat -f%z '{}' + | jq -s add

Est jqun utilitaire? Ne semble pas trouver sur la distribution Debian (Debian 4.9.51-1 (2017-09-28) x86_64 GNU / Linux)
Death Metal
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.