Vous cherchez des tuyaux ( |
). Ils sont un moyen de connecter plusieurs commandes et de passer la sortie d'une commande en entrée à une autre. Dans ce cas, vous souhaitez transmettre tous les noms de fichiers que vous trouvez en entrée du
(qui calcule la taille). Cependant, étant donné du
que les noms de fichiers attendus et les résultats de find
sont juste une liste de texte (oui, le texte se compose de noms de fichiers, mais du
ne peut pas le savoir, tout ce qu'il voit est du texte), vous devez utiliser quelque chose comme xargs
qui prendra chacun ligne de texte, traitez-le comme un nom de fichier et transmettez-le à du
. En rassemblant tout cela, nous obtenons:
find . -name "*.o" | xargs du -sch
vous devez toujours citer les modèles auxquels vous donnez find
(comme je l'ai fait ci-dessus:) "*.o"
. Si vous ne le faites pas, le shell étendra le *.o
aux noms de tous les fichiers correspondants dans le répertoire courant. Cela n'a fonctionné dans ce cas que parce que vous n'aviez aucun fichier correspondant.
Les -sch
indicateurs pour du
sont documentés dans man du
:
-c, --total
produce a grand total
-h, --human-readable
print sizes in human readable format (e.g., 1K 234M 2G)
-s, --summarize
display only a total for each argument
Notez cependant que cela échouera pour les noms de fichiers contenant des espaces. Ce ne sera certainement pas un problème pour les fichiers objets, mais à l'avenir, si vous devez également gérer les espaces, utilisez:
find . -name "*.o" -print0 | xargs -0 du -sch
Les -print0
marques find
impriment des lignes séparées par des valeurs NULL et les -0
marques xargs
prennent ces lignes en entrée.
Alternativement, vous pouvez faire find
imprimer les tailles elles-mêmes, puis les additionner:
find . -name "*.o" -printf '%s\n' | awk '{c+=$1}END{print c}'
Cela contournera également le problème mentionné par @Serg dans les commentaires où il y a trop d'arguments et la commande est divisée en commandes distinctes.
Si vous utilisez bash
(vous l' utilisez probablement), il existe un moyen plus simple:
shopt -s globstar
du -sch **/*.o
La shopt globstar
commande fait **
correspondre tous les fichiers et ou plusieurs sous-répertoires. Après l'avoir activé, **/*.o
correspondra à tous les fichiers (et répertoires) dont le nom se termine .o
, afin que nous puissions le transmettre directement à du
.
Notez que, contrairement à l' find
approche, cela ne correspondra pas aux fichiers cachés (ceux dont le nom commence par un .
). Pour les faire correspondre également, procédez comme suit:
shopt -s dotglob globstar
du -sch **/*.o
du
, et cela produira plusieurstotal
lignes. Voici un exemple: paste.ubuntu.com/23092752shopt globstar
exemple laisse de côté le-s
; J'ai dû utilisershopt -s globstar
similaire à votre deuxième exemple.shopt OPTION
sans-s
ou ou-u
(ou autre option, voirhelp shopt
) imprime simplement la valeur actuelle de OPTION. Vous devezshopt -s OPTION
en activer un etshopt -u OPTION
le désactiver.Utilisez
-exec
flag pour exécuter ladu
commande avec;
(signification pour chaque fichier)Exemple de sortie:
find
est récursif - ce qui signifie qu'il parcourt tous les sous-répertoires. Si vous voulez simplement obtenir le total de tous les*.o
fichiers du répertoire actuel, faites simplementla source
avec perl:
Taille de tous les fichiers PDF non masqués dans le répertoire actuel.
la source
.o
fichiers et ils pourraient se trouver dans des sous-répertoires. Vous pouvez également ajouter un}{
avantprint $sum
pour éviter d'imprimer la somme pour chaque itération. Nous voulons seulement le dernier.