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:
/var/www/html/*
. Supposons qu'il se développe dans /var/www/html/foo
et /var/www/html/bar
. *
(celui de votre cd *
). Notez que c'est le directory de travail actuel. Supposons que vous avez pop
et tart
. 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
. 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