예를 들어 다음 경로를 선택하세요 /var/www/html
.
dir 내부에는 html
몇 가지 하위 디렉터리가 있습니다. cd
이러한 각 하위 디렉터리로 이동 cd
한 다음 해당 디렉터리 내에서 명령을 실행하고 /var/www/html로 돌아가서 다음 디렉터리에 대해 프로세스를 반복하려면 시스템이 필요합니다 .
내가 시도한 방법은 다음과 같습니다. 그러나 작동하지 않는 것 같습니다.
find /var/www/html/* -type d -maxdepth 0 ! -name 'phpmyadmin' -exec cd * && wp plugin update --all {} \;
답변1
먼저 명령을 풀어보겠습니다.
find /var/www/html/* -type d -name 'phpmyadmin' -maxdepth 0 ! -exec cd * && wp plugin update --all {} \;
이것이 실제로 하는 일은 다음과 같습니다.
- 쉘이 확장됩니다
/var/www/html/*
./var/www/html/foo
와 까지 확장된다고 가정해보자/var/www/html/bar
. - 지각이 확장됩니다
*
(지각 내의 지각cd *
). 이것이 현재 작업 디렉토리라는 점에 유의하세요. 당신이 가지고 있다고 가정pop
하고tart
. - 쉘이 실행될 것입니다
find /var/www/html/foo /var/www/html/bar -type d -name phpmyadmin -maxdepth 0 ! -exec cd pop tart
. find
종료되지 않은 명령에 대해서는 오류가 발생합니다. 왜냐하면 또는 가-exec
없기 때문입니다 .;
+
따라서 무슨 일이 일어나고 있는지 명확하게 이해하기 위해 쉘은 줄을 나누고 원하는 부분만 인수로 전달합니다 find
.
가장 깨끗하고 간단한 방법 find
은 다음과 같습니다.
find /var/www/html/* -type d -name phpmyadmin -maxdepth 0 -exec sh -c 'cd "$1" && wp plugin update --all' -- {} \;
이는 전체 명령을 인용하고 공급한 sh
다음 디렉터리를 인수로 전달합니다.
이것도 개인적인 취향이지만, 이와 같은 경우에는 사용하지 않는 것이 더 쉽다고 말하고 싶습니다 find
.
for dir in /var/www/html/*/; do cd "$dir" && wp plugin update --all; done
답변2
tmp.sh
디렉터리에 CD를 넣고 작업을 수행하는 쉘 스크립트를 만들어 보겠습니다. 이제 하위 프로세스의 cd는 상위 프로세스에 영향을 미치지 않으므로 스크립트가 종료된 후 호출 디렉터리로 돌아갑니다.
#!/bin/sh
cd "$1"
wp plugin update --all
그런 다음
type d -name 'phpmyadmin' -maxdepth 0 ! -exec ./tmp.sh '{}' \;
답변3
또 다른 접근 방식은 작은 for 루프를 사용하는 것입니다. 와 결합할 수 있습니다.
for folder in */; do <your-commands-on-$folder>; done
귀하의 예를 사용하면 다음과 같을 수 있습니다.
for folder in /var/www/html/*/phpmyadmin/; do cd "$folder"; wp plugin update --all; done