![쉘에서 하위 디렉토리 작업을 수행하는 방법은 무엇입니까?](https://linux55.com/image/116671/%EC%89%98%EC%97%90%EC%84%9C%20%ED%95%98%EC%9C%84%20%EB%94%94%EB%A0%89%ED%86%A0%EB%A6%AC%20%EC%9E%91%EC%97%85%EC%9D%84%20%EC%88%98%ED%96%89%ED%95%98%EB%8A%94%20%EB%B0%A9%EB%B2%95%EC%9D%80%20%EB%AC%B4%EC%97%87%EC%9E%85%EB%8B%88%EA%B9%8C%3F.png)
예를 들어 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 확장이 없습니다.