Cómo ejecutar un bucle en todos los directorios dentro de un directorio

Cómo ejecutar un bucle en todos los directorios dentro de un directorio

Digamos que tengo un directorio llamado /tmp/main y dentro de él tengo otros 100 directorios.

Quiero ejecutar un bucle a través de cada directorio de esos directorios, por ejemplo para crear un archivo contouch test.txt

¿Cómo le digo al script que procese el primero, el segundo, el tercero y así sucesivamente?

Respuesta1

Un bucle simple funcionaría:

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

El /final del patrón /tmp/main/*/garantiza que si el patrón coincide con algo, coincidirá con un directorio.

En bash, es posible que desee configurar la nullglobopción Shell shopt -s nullglobantes del bucle para asegurarse de que el bucle no se ejecute en absoluto si el patrón no coincide con nada. Sin nullglobconfigurar, el bucle aún se ejecutaría una vez con el patrón sin expandir $dir. Otra forma de solucionarlo sería asegurarse de que $diren realidad sea un directorio antes de llamar touch:

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

o equivalente,

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

Respuesta2

Puedes usar find:

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

Y si desea excluir la /tmp/maincarpeta para que no se devuelva en los resultados de finduso:

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

o

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

información relacionada