답변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" ";"