web-dev-qa-db-fra.com

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

J'utilise une commande similaire à celle-ci:

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

Bien que je n’utilise pas chmod, j’utilise une commande différente que je n’énumérerai pas ici. Cette commande fonctionne bien. Cependant, il existe des milliers de fichiers et de répertoires sur lesquels opérer, et cette opération prend un certain temps. Je me demande s’il existe un moyen d’afficher un total lorsque l’opération est terminée. Peut-être un nombre de fichiers modifiés?

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

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

Ça marchera? Au moins, nous pouvons voir que quelque chose se passe ... Quelqu'un a une meilleure suggestion?

35
ethanpil

Cela marche:

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

Vous devez inclure un second -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 laquelle compter les lignes.

34
David W.

Vous pouvez chaîner plusieurs commandes -exec avec une seule commande de recherche. La syntaxe pour cela est la suivante:

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

qui dans votre cas ressemblerait à ceci:

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

Bien que vous ayez quelques autres options pour cela. Vous pouvez rediriger la sortie vers un fichier:

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

Ou bien, vous pouvez utiliser tee, qui vous permettra d’écrire la sortie dans un fichier journal, et toujours en sortie à l’écran. Je trouve cela utile, car la sortie continuellement diffusée à l'écran me permet de savoir que la commande est toujours en cours d'exécution (non bloquée ou bloquée) et que je dois toujours consulter le fichier journal 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 '+'
9
Tim
find . -name "*.php" -exec chmod 755 {} + -printf '.' | wc -c

Si vous utilisez + au lieu de ";", find essaiera de traiter chmod 755 sur plusieurs 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.

2
user unknown

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

0
ott--

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 ne comportent aucun espace ou autre caractère impair dans le chemin ou le nom. 

0
James Sumners