Como executar um loop em todos os diretórios dentro de um diretório

Como executar um loop em todos os diretórios dentro de um diretório

Digamos que eu tenha um diretório chamado /tmp/main e dentro dele tenho outros 100 diretórios.

Quero executar um loop em cada diretório desses diretórios, por exemplo, para criar um arquivo comtouch test.txt

Como digo ao script para processar o primeiro, o segundo, o terceiro e assim por diante?

Responder1

Um loop simples funcionaria:

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

O /final do padrão /tmp/main/*/garante que se o padrão corresponder a alguma coisa, ele corresponderá a um diretório.

Em bash, você pode querer definir a nullglobopção shell shopt -s nullglobantes do loop para garantir que o loop não seja executado se o padrão não corresponder a nada. Sem nullglobset, o loop ainda seria executado uma vez com o padrão não expandido em $dir. Outra maneira de corrigir isso seria ter certeza de que $diré realmente um diretório antes de chamar touch:

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

ou equivalente,

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

Responder2

Você pode usar find:

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

E se você quiser excluir a /tmp/mainpasta do retorno nos resultados de finduso:

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

ou

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

informação relacionada