많은 단일 레벨 하위 디렉토리가있는 주어진 디렉토리에서 실행될 스크립트를 작성하려고합니다. 스크립트는 각 하위 디렉토리로 cd하고 디렉토리의 파일에서 명령을 실행 한 후 cd를 눌러 다음 디렉토리로 계속 진행합니다. 가장 좋은 방법은 무엇입니까?
답변
for d in ./*/ ; do (cd "$d" && somecommand); done
답변
가장 좋은 방법은 전혀 사용하지 않는 것입니다 cd
.
find some/dir -type f -execdir somecommand {} \;
execdir
와 exec
같지만 작업 디렉토리는 다릅니다.
-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
– 그리고 cd
stderr에 이유에 대한 메시지를 출력 할 것이다 – 그것은 것입니다 break
당신이 경우 / 0이 아닌 종료 코드 W command
성공적으로 실행되지 않거나 실행이 경우 command
어떻게 든 원래 디렉토리로 복귀 할 수있는 능력에 영향을 미친다 – $OLDPWD
. 이 경우에도 cd -
마지막을 수행하고 결과 현재 작업 디렉토리 이름을 stderr에 씁니다.
답변
for D in ./*; do
if [ -d "$D" ]; then
cd "$D"
run_something
cd ..
fi
done