Bash에게 특정 경로 아래의 모든 디렉터리에 CD를 넣고 그 디렉터리에서 명령을 실행하도록 요청하시겠습니까?

Bash에게 특정 경로 아래의 모든 디렉터리에 CD를 넣고 그 디렉터리에서 명령을 실행하도록 요청하시겠습니까?

예를 들어 다음 경로를 선택하세요 /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 {} \;

이것이 실제로 하는 일은 다음과 같습니다.

  1. 쉘이 확장됩니다 /var/www/html/*. /var/www/html/foo와 까지 확장된다고 가정해보자 /var/www/html/bar.
  2. 지각이 확장됩니다 *(지각 내의 지각 cd *). 이것이 현재 작업 디렉토리라는 점에 유의하세요. 당신이 가지고 있다고 가정 pop하고 tart.
  3. 쉘이 실행될 것입니다 find /var/www/html/foo /var/www/html/bar -type d -name phpmyadmin -maxdepth 0 ! -exec cd pop tart.
  4. 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

관련 정보