모든 디렉토리로 cd, 해당 디렉토리의 파일에 대한 명령을 실행하고 이전의 현재 디렉토리로 돌아 가기 디렉토리의 파일에서 명령을 실행 한

많은 단일 레벨 하위 디렉토리가있는 주어진 디렉토리에서 실행될 스크립트를 작성하려고합니다. 스크립트는 각 하위 디렉토리로 cd하고 디렉토리의 파일에서 명령을 실행 한 후 cd를 눌러 다음 디렉토리로 계속 진행합니다. 가장 좋은 방법은 무엇입니까?



답변

for d in ./*/ ; do (cd "$d" && somecommand); done


답변

가장 좋은 방법은 전혀 사용하지 않는 것입니다 cd.

find some/dir -type f -execdir somecommand {} \;

execdirexec같지만 작업 디렉토리는 다릅니다.

   -execdir command {} [;|+]
          Like   -exec,   but  the  specified  command  is  run  from  the
          subdirectory containing the matched file, which is not  normally
          the  directory  in  which  you  started  find.  This a much more
          secure  method  for  invoking  commands,  as  it   avoids   race
          conditions  during resolution of the paths to the matched files.

POSIX가 아닙니다.


답변

cd -P .
for dir in ./*/
do cd -P "$dir" ||continue
   printf %s\\n "$PWD" >&2
   command && cd "$OLDPWD" ||
! break; done || ! cd - >&2

위의 명령은 서브 쉘을 수행 할 필요가 없습니다. 단지 $OLDPWD와 를 교대로하여 현재 쉘에서의 진행 상황을 추적합니다 $PWD. cd -쉘이 기본적으로 디렉토리를 변경함에 따라이 두 변수의 값을 교환 할 때 . 또한 stderr에서 작동 할 때 각 디렉토리의 이름을 인쇄합니다.

방금 두 번째로 살펴보고 오류 처리로 더 나은 작업을 수행 할 수 있다고 결정했습니다. 그것은되는이 할 수없는 말 일세를 건너 뜁니다 cd– 그리고 cdstderr에 이유에 대한 메시지를 출력 할 것이다 – 그것은 것입니다 break당신이 경우 / 0이 아닌 종료 코드 W command성공적으로 실행되지 않거나 실행이 경우 command어떻게 든 원래 디렉토리로 복귀 할 수있는 능력에 영향을 미친다 – $OLDPWD. 이 경우에도 cd -마지막을 수행하고 결과 현재 작업 디렉토리 이름을 stderr에 씁니다.


답변

for D in ./*; do
    if [ -d "$D" ]; then
        cd "$D"
        run_something
        cd ..
    fi
done


답변