Barre de progression Grep à l'aide de PV (visualiseur de tuyaux)

11

J'ai un énorme répertoire sur mon ordinateur et je dois rechercher dans chaque fichier ruby ​​à l'intérieur une chaîne.

J'aurais pu le faire comme ceci: grep -R "string" *.rbmais cela prend très longtemps et j'aimerais utiliser pv (pipe viewer) pour afficher une barre de progression pour pouvoir suivre les grepprogrès.

Mais je ne sais pas vraiment comment puis-je écrire cette commande car il y a encore des choses que je ne peux pas comprendre à propos de cette commande.

Quelqu'un a-t-il une idée?

Cydonia7
la source

Réponses:

15

pvfonctionne sur des tuyaux (pas sur des commandes) - Il s'agit d'une jauge de volume indiquant la quantité de données qui a dépassé un point donné dans le pipeline.
Votre commande grep n'est pas un pipeline ( |- le pipe operatorest introuvable) - c'est juste une seule commande qui fait son travail. pvne peut pas vous aider ici, il vous suffit de faire confiance à ce qui grepfait réellement son travail sur tous les fichiers d'entrée.

Vous pouvez bricoler quelque chose avec find, pv, xargs & grep (on find . -name "*.rb" | pv | xargs grep [regex]dirait que cela pourrait être prometteur, mais vous devrez indiquer pvla taille de la findsortie pour qu'elle donne des résultats significatifs.

Franchement, cela semble plus de travail qu'il n'en vaut la peine. Exécutez simplement votre grep, attendez patiemment et traitez la sortie quand c'est fait.

voretaq7
la source
1
C'est certainement possible , c'est juste alambiqué et cela prendra probablement plus de temps à mettre en place et à travailler qu'attendre la fin du grep :-)
voretaq7
1
Pourrait être un très bel extrait: p
Cydonia7
4

Deux autres méthodes:

for file in *.rb; do echo $file; grep "string" $file >> output.txt; done

Ou, dans un autre shell pendant l'exécution de votre commande d'origine, recherchez le pid de la commande grep, puis:

strace -q -s 256 -e trace=open -p [pid] 2>&1 | head

Les deux ci-dessus vous montreront sur quel fichier la commande grep travaille actuellement. Vous pouvez trouver le nombre total de fichiers avec:

ls -l *.rb | wc -l

Enfin, utilisez-le pour déterminer le numéro du fichier actuel dans la liste:

ls -l *.rb | grep -n [the current filename]

PS Mes réponses supposent que tous vos fichiers sont dans un seul répertoire. Si ce n'est pas le cas, vous devrez utiliser à la findplace lset *.rbcomme suggéré.

Ladadadada
la source
1
C'est une bonne alternative
Cydonia7
1

Je ne sais pas quel système d'exploitation vous utilisez, mais grep -R "string" *.extpeut ne pas fonctionner correctement pour vous.

Vous pourriez être mieux servi en utilisant findconjointement avec grep:

find . -type f -name "*.rb" -print0 |xargs --null grep "string"

mince
la source
À droite, la commande que j'ai donnée fonctionne réellement sur Fedora 16 mais la vôtre est plus claire. Merci !
Cydonia7
1

Dans les versions récentes de pvil y a une "-d"option pour regarder tous les FD d'un autre processus.

Donc, en théorie, pvcela ne fonctionnera pas seulement comme un tuyau, mais aussi comme un indicateur de progrès pour tout un processus. (Par exemple, essayez-le avec le PID de votre Firefox)

Pour le problème ci-dessus, une idée plus simple est la suivante: pendant que le grepest en cours d'exécution, utilisez-le lsofavec watch.

$ watch -n 1 "lsof | grep -n $PWD"

De cette façon, vous pouvez suivre la progression de votre grep.

Jan Walzer
la source
0

As-tu déjà essayé

grep -R "string" *.rb | pv

Je ne sais pas si cela fonctionne réellement car il ne sait pas combien de bits de données totales rechercher car il est récursif?

nhutto
la source
4
Je ne pense pas que cela va faire ce qu'il veut - pvfonctionnera sur la sortie du grep (même s'il a précisé la taille d'entrée complète pvne voit que la sortie en sortant la fin du tuyau - Il serait ainsi sous -counting bytes.
voretaq7
0

J'utilise généralement le système de fichiers proc sur les systèmes Linux, c'est-à-dire

ls -al /proc/<pid of grep>/fd

Ceci répertorie tous les fichiers que l'invocation grep a ouverts actuellement et donne ainsi une idée de l'endroit où se trouve actuellement la recherche.

centique
la source