쉘에서 하위 디렉토리 작업을 수행하는 방법은 무엇입니까?

쉘에서 하위 디렉토리 작업을 수행하는 방법은 무엇입니까?

예를 들어 n개의 정렬된 하위 디렉터리에서 명령을 실행합니다. 여기서 n은 입력입니다. 아니면 해당 범위를 입력으로 사용할 수 있는 하위 디렉터리 범위에 대해 for 루프를 어떻게 실행할 수 있나요? 아래와 같이, 여기서 범위를 어떻게 정의해야 합니까?

for d in ["sd1"-"sd2"] do ( cd "$d" && do stuff ) done

답변1

중괄호 확장을 지원하는 셸이 있는 경우 중괄호 확장을 사용하세요.

for d in sd{1..2}; do
    ( cd "$d" && dostuff )
done

zsh, ksh93또는 yash -o braceexpand( 제외 )을 사용하여 bash이 작업을 수행할 수 있습니다.

n=4
for d in sd{1..$n}; do
    ( cd "$d" && dostuff )
done

관련 질문:"eval" 없이 {} 확장에서 변수를 사용할 수 있나요?

이에 대한 변형은 다음과 같습니다.

for (( i=1; i<=n; ++i )); do
  str="sd$i"
  ( cd ... )
done

for이는 다른 쉘에서 지원하는 것과 동일한 C 스타일 루프입니다 bash(여전히 POSIX 표준의 확장임에도 불구하고).

답변2

를 사용하면 zsh다음을 수행할 수 있습니다.

for d (sd<1-10>(Nn-/)) (cd $d && dostuff)
  • <1-10>1에서 10 사이의 10진수를 일치시키는 전역 연산자입니다. 1, ... 와 일치합니다 . 임의의 양의 십진수와 일치하도록 001만들 수 있습니다 .<->
  • (Nn-/)글로벌 예선입니다.
    • N일치하는 항목이 없어도 실패하지 않습니다.
    • n요소를 숫자로 정렬합니다(따라서 sd10뒤쪽에 있음 sd2).
    • -/디렉토리 유형의 파일만 포함합니다(기호 링크 분석 후).

날짜가 디렉토리 이름으로 인코딩된 두 날짜 사이의 디렉토리를 나열하려는 경우(예 sd2017-08-01: ):

for d (sd<->-<->-<->(Nne{'
  [[ ! $REPLY < sd2015-06-06 && ! $REPLY > sd2017-08-09 ]]'}-/))
  (cd $d && dostuff)

답변3

seq다른 가능한 해결책은 가능한 경우 명령을 사용하는 것입니다.

for i in `seq -f "sd%03.0f" 111 121`
do
( cd "$i" && do stuff )
done

답변4

전역 확장이 정렬되어 있으므로 다음을 수행할 수 있습니다.

state=0
for d in *; do
   case $d in "sd1") state=1;; "sd2") break;; esac
   if [ 1 -eq "$state" ]; then
      ( cd "$d" && dostuff )
   fi
done

sd1여기서는 과 가 sd2실제 예가 아니며 범위는 사소한 수치 범위로 설명할 수 없다고 가정합니다 . 가능하다면 나는 사용할 것이다로미오 니노프~의해결책.

Brace 확장은 매우 깔끔하지만 불행하게도 POSIX 요구 사항이 아니기 때문에 많은 POSIX 셸에 Brace 확장이 없습니다.

관련 정보