L'aide de la recherche avec -exec {}, est-il un moyen de compter le total?
Je suis l'aide d'une commande semblable à celui-ci:
find . -name "*.php" -exec chmod 755 {} \;
Bien, 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 "+"; {} \;
Ça marche? Au moins, nous pouvons voir que quelque chose se passe... quelqu'un a une meilleure suggestion?
- Pour aider les autres qui peuvent avoir des problèmes avec les noms de fichiers et des espaces. Vous pouvez placer des guillemets autour de {} pour résoudre les processus, les fichiers/répertoires. trouver . -name "*.php" -exec chmod 640 "{}" \;
Vous devez vous connecter pour publier un commentaire.
Cela fonctionne:
Vous devez inclure une deuxième
-exec /bin/echo
pour que cela fonctionne. Si lefind
commande n'a pas de sortie, puiswc
ne possède pas d'entrée pour compter les lignes.find . -name "*.php" -exec chmod 755 {} \; -exec /bin/echo {} \; | wc -l | { read count; echo "Done. $count php file(s) processed."; }
-print
option pour le trouver, au lieu de l'exécution d'une deuxième commande. Quelque chose comme:find . -name "*.php" -print -exec chmod 755 {} \; | wc -l
-exec
avec le-print
, mais je suppose qu'il n'y a aucune raison pourquoi ça ne marcherait pas.Vous pouvez enchaîner plusieurs
-exec
commandes avec une seule commande rechercher. La syntaxe est:qui dans votre cas devrait ressembler à ceci:
Bien que vous avez un peu d'autres options pour cela. Vous pouvez rediriger la sortie vers un fichier:
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.Si vous utilisez le + au lieu de ";", trouver va essayer de traiter les chmod 755 sur de nombreux fichiers en parallèle.
Vous pouvez effectuer des commandes supplémentaires après le premier, ici, par exemple imprimer une dot, et de compter les points à la fin.
Vous pouvez utiliser xargs et pv. Éventuellement:
Remarque: ce n'est que d'aller travailler si votre *.php les fichiers n'ont pas d'espaces ou d'autres caractères illisibles dans le chemin ou le nom.
-print0
pour trouver et-0
pour xargs, il va résoudre toutes vos questions liées à l'espacepv
. Si vous n'avez pas de rediriger la sortie defind
avec de nouvelles lignes, alors vous ne pouvez pas utiliser la ligne-commutateur de mode pourpv
. Et si vous n'utilisez pas l'interrupteur, puis venir avec un moyen de direpv
la quantité de données à l'espérons, sera un peu plus délicat.find . -name "*.php" -print0 -fprint >(pv --line-mode) | xargs -0 chmod 755
Avec l'option-exec trouvez commencera un sous-processus pour chaque fichier trouvé. Vous pourriez accélérer le processus en utilisant xargs comme
find . -name '*.php' | xargs chmod 755
- chmod est lancé qu'une seule fois.xargs
si il y a des espaces, des tabulations ou des NL dans les noms de fichier. Aussi,xargs
ne pas forcément prendre les noms de tous les fichiers. Il se remplit de la ligne de commande de la mémoire tampon, exécute la commande, puis sélectionne le prochain groupe de fichiers.find . -name "*.php" -exec chmod 755 {} +
. Vous avez failli ne jamais avoir besoin de xargs avec trouver.