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: 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? P> Merci!
Alex p> p>
7 Réponses :
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. P>
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. p>
Parce que vous pouvez le trouver utile / intéressant, la page Man peut être trouvée en ligne ici: 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 p> où vous voulez probablement p> 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. p> p>
Une solution alternative consiste à utiliser AWK:
find . -name "*.txt" -exec ls -lt {} \; | awk -F " " 'BEGIN { sum=0 } { sum+=$5 } END { print sum }'
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=-
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 i> Nettoyant. Merci!
-Print0 code> n'est techniquement pas
POSIX code> (pour la raison Bizarre que toutes les commandes ne peuvent pas gérer les fichiers se terminant dans
$ '\ 0' code>). Bien que la plupart des implémentations semblent avoir étendu l'option.
find . -type f -print0 | grep -azZEi '\.(te?xt|rtf|docx?|wps)$' | du --files0-from=-
Bien plus facile à retenir que -exec echo {} "= 0"; code>. non attends. Ce n'est pas juste. Uhhh
-exec echo -n {} "\ 0" \; code>. Non?
-exec echo $ $ # & @ * # (@! @ # $ $ @ # !!! code> (beaucoup mieux)
La première façon que vous avez énumérée ne rentrera jamais dans le test -Name * .txt code> test et le glob glob
*. Txt code> se développera avant que le
est exécuté code> est exécuté Si vous avez
.txt code> fichiers de votre répertoire de travail.
Vous avez raison. Merci d'avoir souligné la faute de frappe. Je l'ai corrigé.
Une autre solution simple:
Pour améliorer la qualité de votre message, veuillez inclure comment / pourquoi votre message résoudra le problème.
une solution alternative consiste à utiliser Bash C'est bon pour le moment où vous avez besoin de plus de contrôle de ce qui se passe dans la boucle. P > p> pour code> boucle:
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