for 루프의 코드가 bash 셸의 첫 번째 디렉터리에서만 실행되는 이유는 무엇입니까?

for 루프의 코드가 bash 셸의 첫 번째 디렉터리에서만 실행되는 이유는 무엇입니까?

라는 디렉토리 아래에는 특정 작업을 수행하려는 a하위 폴더가 많이 있습니다 . 모두에게 동일합니다. 다음을 수행하지만 첫 번째 하위 디렉터리에서만 작동합니다.

for i in "a/*"
    do
            #echo $i
            cd $i
            mkdir test
            mv *_no test
            touch aaa
            cd ..
    done

위의 코드를 사용하고 싶습니다 a.

답변1

첫 번째 cdchdir은 첫 번째 디렉터리(두 수준의 하위 디렉터리)로 이동합니다. cd한 레벨만 돌아왔기 때문에 그 다음에는 두 번째 레벨로 진행할 수 없습니다 . 즉, 시작한 곳으로 돌아오지 않습니다. 하지만 그럼에도 불구하고 여전히 "a/*"라는 하나의 값을 반복하고 있습니다.

이 내용을 인용하셨기 때문에 확장되지는 않습니다.

그러나 주위에 따옴표를 넣는 것을 잊었으므로 $i그 시점에서는 인수로 확장됩니다 cd.

코드에는 다른 많은 문제가 있습니다.

개선을 위한 몇 가지 제안:

for i in a/*/; do
  (
    cd -- "$i" &&
      mkdir -p test || exit
    mv -- *_no test
    touch aaa
  )
done

답변2

s를 사용할 때는 glob따옴표를 제거해야 합니다. 그렇지 않으면 globs는 확장되지 않습니다.

그래서:

for i in a/*

답변3

루프 내에서 $i를 참조하면 a/*/이미 단어로 확장되었기 때문에 아무 작업도 수행되지 않습니다. 예를 들어 a/*/a/My Documents/로 확장하는 경우 첫 번째 루프 $i = a/My와 두 번째 루프 에서 $i = Documents/ 다음을 시도하십시오.

find . -maxdepth 1 -type d | while read i; do
  (
    cd -- "$i" &&
      mkdir -p test || exit
    mv -- *_no test
    touch aaa
  )
done

관련 정보