Demander Bash à cd dans chaque directory sous un certain path et exécuter une command quand il est à l'intérieur?

Prenez ce path par exemple: /var/www/html .

Dans le directory dir html , il y a quelques sous-directorys. J'ai besoin du système pour aller dans chacun de ces sous-directorys via cd (il doit être cd ), puis en exécutant une command quand il est dans ce directory, returnner à / var / www / html et répéter le process avec le prochain dir.

C'est ce que j'ai essayé, mais cela semble inefficace:

 find /var/www/html/* -type d -maxdepth 0 ! -name 'phpmyadmin' -exec cd * && wp plugin update --all {} \; 

Laisse d'abord démonter ta command:

 find /var/www/html/* -type d -name 'phpmyadmin' -maxdepth 0 ! -exec cd * && wp plugin update --all {} \; 

Ce que cela va réellement faire est:

  1. Le shell va se développer /var/www/html/* . Supposons qu'il se développe dans /var/www/html/foo et /var/www/html/bar .
  2. Le shell va se développer * (celui de votre cd * ). Notez que c'est le directory de travail actuel. Supposons que vous avez pop et tart .
  3. Le shell va exécuter find /var/www/html/foo /var/www/html/bar -type d -name phpmyadmin -maxdepth 0 ! -exec cd pop tart find /var/www/html/foo /var/www/html/bar -type d -name phpmyadmin -maxdepth 0 ! -exec cd pop tart .
  4. find va lancer une erreur sur une command non -exec , parce qu'elle a vu -exec mais non ; ou + .

Donc pour être clair ce qui se passe, le shell est en train de rompre la ligne, et seulement en passant une partie de ce que vous vouliez être un argument à find .

Le moyen le plus propre et le plus simple de le faire avec find est:

 find /var/www/html/* -type d -name phpmyadmin -maxdepth 0 -exec sh -c 'cd "$1" && wp plugin update --all' -- {} \; 

Ceci cite la command entière, la transmet à sh , puis transmet le directory en argument.

C'est aussi un goût personnel, mais pour des trucs comme ça, je dirais qu'il est plus facile de ne pas utiliser find :

 for dir in /var/www/html/*/; do cd "$dir" && wp plugin update --all; done 

Laissez-nous créer un script shell tmp.sh que cd's à votre directory et fait le travail. Maintenant cd dans un enfant n'influence pas le parent, donc après la sortie du script, vous êtes de return dans le directory d'appel

 #!/bin/sh cd "$1" wp plugin update --all 

et alors

  type d -name 'phpmyadmin' -maxdepth 0 ! -exec ./tmp.sh '{}' \; 

Une autre façon serait avec un petit pour la boucle. Vous pourriez cela en ligne avec

 for folder in */; do <your-commands-on-$folder>; done 

En utilisant votre exemple qui pourrait être

 for folder in /var/www/html/*/phpmyadmin/; do cd "$folder"; wp plugin update --all; done