답변:
for d in ./*/ ; do (cd "$d" && somecommand); done
for d in ./*/ ; do (cd "$d" && ls); done
됩니다 : , 작동하지 않습니다. 그러나 for d in ./*/ ; do (cd "$d" && for d in ./*/ ; do (cd "$d" && ls); done ); done
작동합니다. -이 예제에서 ls를 명령으로 사용.
-bash: cd: ./*/: No such file or directory
가장 좋은 방법은 전혀 사용하지 않는 것입니다 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가 아닙니다.
find
해당 명령을 실행하므로 별칭을 인식하지 못합니다. 무엇 md
과는 .link
디렉토리?
bash
: find . -type f -iname '*.link' -execdir ${BASH_ALIASES[md]} -i {} \;
당신은 할 필요가 없습니다 cat
에 wget
가지고있는 -i
파일에서 URL 읽기에 대한 플래그. 또한 이것은 원래 질문과 다소 다릅니다 (이름이있는 파일에만 관심이있는 것 같고 .link
다른 파일은 없을 수 있기 때문에).
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에 씁니다.
youtube-dl
.