Suivi des progrès au sein de xargs

Existe-t-il un moyen de suivre ou de suivre les progrès au sein de xargs ?

Je remplace un for loop par find … | xargs find … | xargs pour la performance (en particulier pour exécuter des tâches en parallèle). J’ai lu que parallel a un indicateur de progression, mais je me demandais s’il y avait un moyen d’accomplir cela ssortingctement en utilisant xargs .

Je suis également conscient que les tâches exécutées en parallèle via xargs ne se termineront pas nécessairement dans le bon ordre, ce qui complique la surveillance des progrès. Même si une solution me donnait une idée générale des progrès, ce serait un bon début.

Si vous voulez simplement saisir le nombre de lignes que vous avez déjà traitées, vous pouvez créer une fonction shell simple pour le faire

 #!/bin/bash #----- ## ## @function count ## ## @desc Write every n'th number (if n is 5 write 5, 10, 15, ...) ## ## @param $1 - number ## #----- function count { typeset C=0 while read L; do C=$(( C + 1 )) if [ $(( $C % $1 )) -eq 0 ]; then echo $C 1>&2 fi echo "$L" done } find . | count 100 | xargs ... 

Le petit problème est que cela affiche le nombre de lignes passées à xargs, pas le nombre de lignes déjà traitées par la commande appelée par xargs. De plus, chaque tube contient un tampon, il affichera donc un nombre légèrement supérieur à ce qu’il devrait être. Sur ma machine, il y avait ~ 500 lignes d’avance à l’état réel mais si vous traitez suffisamment de lignes, le nombre de lignes 500 est négligeable 🙂

Si vous cherchez juste une indication générale du progrès, la méthode la plus simple consiste à simplement faire écho avant de faire la commande que vous souhaitez faire.

Exemple: cat | xargs -I{} sh -c 'echo {}; ;' cat | xargs -I{} sh -c 'echo {}; ;'

-I{} définit {} sur la chaîne en cours de traitement

sh -c vous permettra d’exécuter plusieurs commandes (note: un point-virgule après chaque commande est requirejs, y compris le dernier .

Vous pouvez utiliser pv pour surveiller le tube (pas en termes de fichiers, car il se trouve dans votre tube), mais vous devrez indiquer à pv la taille de la sortie de recherche, ce qui semble très lourd (voir cette réponse ).

Je recommande vraiment d’utiliser parallel , en fonction de ce que vous essayez d’accomplir… c’est exactement ce pour quoi il a été conçu.

Sinon, si les outils de développement Apple sont installés, vous pouvez écrire un petit script qui génère un fichier Makefile pour accomplir la même tâche et vous assurer qu’il imprime la progression comme vous le souhaitez.