9
votes

Pourquoi "trouver" -Name * .txt | xargs du -hc "donner plusieurs totaux?

J'ai un grand ensemble de répertoires pour lesquels j'essaie de calculer la taille totale de la somme de plusieurs centaines de fichiers .txt. J'ai essayé ceci, qui fonctionne principalement: xxx

mais au lieu de me donner un total à la fin, j'en reçois plusieurs. Je suppose que le tuyau ne transmettra que de nombreuses lignes de la production de la recherche à la fois, et Du fonctionne simplement sur chaque lot tel qu'il vient. Y a-t-il un moyen autour de cela?

Merci! Alex


1 commentaires

HM OK. J'ai essayé: trouver. -Name * .txt | Xargs -n 100000 du -hc Mais cela ne semble pas fonctionner - je reçois plus de sous-totaux, pas moins. Essayer de trouver. -Name * .txt | Xargs -L 1000 du -hc ne semble pas fonctionner bien non plus non plus. Soit "Xargs: liste d'arguments trop longue", soit il ne fonctionne que sur un très peu de fichiers. Toute autre pensée? Merci! Alex


7 Réponses :


0
votes

Xargs buste son entrée dans des morceaux de taille raisonnable - ce que vous voyez sont totaux pour chacun de ces morceaux. Vérifiez la page de l'homme pour Xargs sur les moyens de configurer sa manipulation des entrées.


0 commentaires

5
votes

Le programme Xargs brise les choses en lots, pour tenir compte des limites dues à la longueur maximale d'une ligne de commande UNIX. Il est encore plus efficace que la gestion de votre sous-commande une à la fois, mais pour une longue liste d'entrées, il exécutera la commande suffisamment de fois que chaque «course» est suffisamment courte qu'elle ne causera pas de problèmes.

à cause de cela , vous voyez probablement une ligne de sortie par «lot» que Xargs doit fonctionner.

Parce que vous pouvez le trouver utile / intéressant, la page Man peut être trouvée en ligne ici: http://unixhelp.ed.ac.uk/cgi/man-cgi?xargs < / P>


Une autre chose à noter (et cela peut être une faute de frappe dans votre poste ou mon malentendu) est que vous avez le "* .txt" non évalué / cité. C'est-à-dire que vous avez xxx

où vous voulez probablement xxx

la différence étant que la ligne de commande peut élargir le * dans la liste des noms de fichiers qui correspondent ... plutôt que de passer la * dans la recherche, ce qui l'utilisera comme un motif.


0 commentaires

0
votes

Une solution alternative consiste à utiliser AWK:

find . -name "*.txt" -exec ls -lt {} \; | awk -F " " 'BEGIN { sum=0 } { sum+=$5 } END { print sum }'


0 commentaires

12
votes

Que diriez-vous d'utiliser l'option --FileS0-depuis la du? Vous devez générer la sortie de fichier NULL terminée de manière appropriée:

find . -name "*txt" -exec echo -n -e {}"\0" \; | du -hc --files0-from=-


3 commentaires

Ah, cela a travaillé pour moi, mais j'ai utilisé la trouvaille de TRINT0 au lieu de l'écho EXED.


Hmm ... je ne savais pas l'option -print0. C'est beaucoup Nettoyant. Merci!


-Print0 n'est techniquement pas POSIX (pour la raison Bizarre que toutes les commandes ne peuvent pas gérer les fichiers se terminant dans $ '\ 0' ). Bien que la plupart des implémentations semblent avoir étendu l'option.



7
votes
find . -type f -print0 | grep -azZEi '\.(te?xt|rtf|docx?|wps)$' | du --files0-from=-

3 commentaires

Bien plus facile à retenir que -exec echo {} "= 0"; . non attends. Ce n'est pas juste. Uhhh -exec echo -n {} "\ 0" \; . Non? -exec echo $ $ # & @ * # (@! @ # $ $ @ # !!! (beaucoup mieux)


La première façon que vous avez énumérée ne rentrera jamais dans le test -Name * .txt test et le glob glob *. Txt se développera avant que le est exécuté est exécuté Si vous avez .txt fichiers de votre répertoire de travail.


Vous avez raison. Merci d'avoir souligné la faute de frappe. Je l'ai corrigé.



3
votes

Une autre solution simple: xxx


1 commentaires

Pour améliorer la qualité de votre message, veuillez inclure comment / pourquoi votre message résoudra le problème.



1
votes

une solution alternative consiste à utiliser Bash pour boucle: xxx

C'est bon pour le moment où vous avez besoin de plus de contrôle de ce qui se passe dans la boucle.


0 commentaires