디렉토리 내의 모든 디렉토리를 통해 루프를 실행하는 방법

디렉토리 내의 모든 디렉토리를 통해 루프를 실행하는 방법

라는 디렉토리가 있고 /tmp/main 그 안에 100개의 다른 디렉토리가 있다고 가정해 보겠습니다.

예를 들어 다음을 사용하여 이러한 각 디렉토리를 반복하고 싶습니다.touch test.txt

첫 번째, 두 번째, 세 번째 등을 처리하도록 스크립트에 어떻게 지시합니까?

답변1

간단한 루프가 작동합니다.

for dir in /tmp/main/*/; do
    touch "$dir"/test.txt
done

/패턴 끝의 보장은 /tmp/main/*/패턴이 무엇이든 일치하면 디렉터리와 일치한다는 것입니다.

에서는 패턴이 일치하지 않는 경우 루프가 전혀 실행되지 않도록 bash루프 전에 nullglob셸 옵션을 설정해야 할 수도 있습니다. 설정 shopt -s nullglob하지 않으면 nullglob루프는 한 번만 실행되고 패턴은 에서 확장되지 않습니다 $dir. 이 문제를 해결하는 또 다른 방법은 다음을 호출하기 전에 $dir실제로 디렉터리인지 확인하는 것입니다 touch.

for dir in /tmp/main/*/; do
    if [ -d "$dir" ]; then
        touch "$dir"/test.txt
    fi
done

또는 동등하게,

for dir in /tmp/main/*/; do
    [ -d "$dir" ] && touch "$dir"/test.txt
done

답변2

당신은 그것을 사용할 수 있습니다 find:

find /tmp/main -type d -exec touch {}/test.txt \;

/tmp/main다음을 사용하여 결과에서 이 폴더를 제외하려면 다음을 사용하세요 find.

find /tmp/main ! -path /tmp/main -type d -exec touch {}/test.txt \;

또는

find /tmp/main -mindepth 1 -type d -exec touch {}/test.txt \;

관련 정보