인수를 사용하여 여러 디렉터리에서 bash 스크립트를 실행하는 방법은 무엇입니까? [복사]

인수를 사용하여 여러 디렉터리에서 bash 스크립트를 실행하는 방법은 무엇입니까? [복사]

쉘 스크립트와 폴더 트리가 있지만 app1.sh각 폴더 내에서 이 쉘을 실행하는 방법을 모르겠습니다. 이것은app1.sh 스크립트

스크립트는 문자열, 정수 및 파일을 작업 매개변수로 받습니다. 아이디어는 디렉터리 내의 4개 폴더에서 실행하는 것입니다.

도움을 주셔서 감사합니다 :)

답변1

(추가 설명이 없으므로 질문 제목의 "인수"를 무시하십시오.) 스크립트가 app1.sh현재 디렉터리에 있고 현재 디렉터리 내의 모든 디렉터리와 하위 디렉터리에서 이 스크립트를 실행한다고 가정합니다.

shopt -s globstar nullglob dotglob

runme=$PWD/app1.sh

for folder in ./**/; do
    ( cd "$folder" && "$runme" )
done

**와일드카드 모드( 셸 옵션을 통해 활성화됨)를 사용하여 globstar모든 디렉터리를 찾습니다. 그런 다음 이러한 디렉터리를 반복하고 cd각 디렉터리에 대한 디렉터리 변경을 사용한 다음 해당 디렉터리를 현재 작업 디렉터리로 사용하여 스크립트를 실행합니다.

하위 디렉터리가 아닌 최상위 디렉터리만 처리하려면 제거 globdot하고 ../**/./*/

nullglob패턴이 일치하지 않으면(디렉토리 없음) 루프를 전혀 실행하지 않도록 쉘 옵션이 설정되고, dotglob숨겨진 디렉토리도 일치하도록 쉘 옵션이 설정됩니다.

루프 본문 주위의 괄호는 명령을 하위 쉘로 묶습니다. 현재 작업 디렉토리는 서브쉘에 대해 로컬이므로 cd스크립트를 실행한 후 "다시 종료"할 필요가 없습니다.


사용 find:

runme=$PWD/app1.sh

find . -type d -exec sh -c '
    runme=$1; shift
    for folder do
        ( cd "$folder" && "$runme" )
    done' sh "$runme" {} +

이것은 동일한 작업을 수행합니다(거의; 이것은 디렉토리에 대한 심볼릭 링크를 확인하지 않으며현재의목차). 발견된 디렉토리 배치의 경우 짧은 인라인 쉘 스크립트를 호출합니다. 스크립트는 실행할 스크립트의 경로 이름을 선택한 다음 나머지 인수(찾은 디렉터리)를 반복하고 해당 디렉터리로 변경한 후 스크립트를 실행합니다.

하위 디렉터리가 아닌 최상위 디렉터리만 처리하려면 -maxdepth 1다음 명령에 테스트를 추가하세요 find.

find . -maxdepth 1 ...as before...

현재 디렉터리를 처리하지 않으려면 위와 비슷한 방식 으로 명령에 -mindepth 1또는 를 추가하세요. 또 다른 방법은 현재 디렉토리의 모든 디렉토리를 검색 경로로 -name . -prune -o사용하는 것입니다 . 그러나 다음과 같은 경우 "매개변수 목록이 너무 김" 오류로 인해 실패합니다.find ./*/ ...수천현재 디렉토리 내의 디렉토리(이러한 최상위 디렉토리를 원할 경우 -maxdepth 1에도 변경해야 하지만 솔직히 이 경우 일반 쉘 루프를 사용하겠습니다).-maxdepth 0

-mindepth비표준 테스트 이지만 -maxdepth일반적으로 구현됩니다.

관련된:

답변2

find다음을 사용 하여 이 작업을 수행할 수 있습니다 -type d.

$ PWD=$(pwd); SCRIPT=/full/path/to/script.sh; find . -type d -exec bash -c "cd {}; $SCRIPT; cd $PWD" ";"

한 번만 사용하면 -execdir피할 수 있습니다 cd $PWD.

$ SCRIPT=/full/path/to/script.sh; find . -type d -execdir bash -c "cd {}; $SCRIPT" ";"

관련 정보