디렉토리 내부의 모든 디렉토리에서 루프를 실행하는 방법

디렉토리 내부의 모든 디렉토리에서 루프를 실행하는 방법

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

예를 들어 다음과 같은 파일을 만들기 위해 해당 디렉토리의 각 디렉토리를 통해 루프를 실행하고 싶습니다.touch test.txt

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

답변1

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

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

/패턴 끝에는 패턴 /tmp/main/*/이 일치하는 항목이 있으면 디렉터리와 일치함을 보장합니다.

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

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 \;

관련 정보