
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 nullglob
opción Shell shopt -s nullglob
antes del bucle para asegurarse de que el bucle no se ejecute en absoluto si el patrón no coincide con nada. Sin nullglob
configurar, 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 $dir
en 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/main
carpeta para que no se devuelva en los resultados de find
uso:
find /tmp/main ! -path /tmp/main -type d -exec touch {}/test.txt \;
o
find /tmp/main -mindepth 1 -type d -exec touch {}/test.txt \;