35 votes

En utilisant find avec -exec {}, existe-t-il un moyen de compter le total?

Je suis l'aide d'une commande semblable à celui-ci:

find . -name "*.php" -exec chmod 755 {} \;

Bien que, je ne suis pas à l'aide de la commande chmod, je suis à l'aide d'une autre commande qui je ne vais pas faire la liste ici. Cette commande fonctionne bien. Cependant, il y a des milliers de fichiers et de répertoires d'être opéré, et cette opération prend un certain temps. Je me demande si il existe un moyen d'afficher une sorte de total lorsque l'opération est terminée? Peut-être un nombre de fichiers modifiés?

La seule chose à laquelle je pense est de faire simplement quelque chose comme:

find . -name "*.php" -exec chmod 755; echo "+"; {} \;

Ce travail? Au moins, nous pouvons voir que quelque chose se passe... quelqu'un a une meilleure suggestion?

34voto

David W. Points 49436

Cela marche:

 $ find . -name "*.php" -exec chmod 755 {} \; -exec /bin/echo {} \; | wc -l
 

Vous devez inclure un deuxième -exec /bin/echo pour que cela fonctionne. Si la commande find n'a pas de sortie, alors wc n'a pas d'entrée pour compter les lignes.

9voto

Tim Points 5541

Vous pouvez enchaîner plusieurs -exec des commandes avec une seule commande rechercher. La syntaxe est:

find . -exec cmd1 \; -exec cmd2 \; -exec cmd3 \;

qui dans votre cas devrait ressembler à ceci:

find . -name '*.php' -exec chmod 755 {} \; -exec echo '+' \;

Même si vous avez un peu d'autres options pour cela. Vous pouvez rediriger la sortie vers un fichier:

find . -name '*.php' -exec chmod 755 {} \; > logfile.txt

Ou, vous pouvez utiliser tee, ce qui vous permettra d'écrire la sortie dans un fichier de log, et encore sortie à l'écran. Je trouve cela utile, comme la permanence diffusée sur la sortie à l'écran me permet de savoir que la commande est toujours en cours (pas écrasé ou bloqué), et j'ai toujours le fichier journal pour vous y référer ultérieurement.

find . -name '*.php' -exec chmod 755 {} \; | tee logfile.txt
wc -l logfile.txt           // prints the lines in the file
grep -c '^+$' logfile.txt   // prints the lines containing a single '+'

2voto

user unknown Points 15555
 find . -name "*.php" -exec chmod 755 {} + -printf '.' | wc -c
 

Si vous utilisez + au lieu de ";", find essaiera de traiter chmod 755 sur de nombreux fichiers en parallèle.

Vous pouvez exécuter des commandes supplémentaires après la première, ici, par exemple imprimer un point et compter les points à la fin.

0voto

ott-- Points 4124

Avec l'option -exec, find lancera un sous-processus pour chaque fichier trouvé. Vous pouvez accélérer cela en utilisant des xargs comme find . -name '*.php' | xargs chmod 755 - chmod n'est démarré qu'une seule fois.

0voto

jsumners Points 6247

Vous pouvez utiliser xargs et pv . Peut-être:

 find . -name "*.php" | pv --line-mode | xargs chmod 755
 

Remarque: cela ne fonctionnera que si vos fichiers * .php n'ont pas d'espaces ou d'autres caractères impairs dans le chemin ou le nom.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X