Se você estiver usando o bash ≥4 ou zsh ou ksh93 ≥o + 1 , você pode fazer o shell fazer globalização recursiva: o curinga **/ corresponde aos diretórios em qualquer profundidade. No bash, você precisa habilitar o recurso com shopt -s globstar (bash), e cuidado que até bash 4.2, **/ atravessa links simbólicos para diretórios. Em ksh93, você precisa de set -o globstar (ksh93); em zsh, está sempre ativado.
for x in **/*.txt; do …
Se você precisar que seu script seja portável para outros shells, use O comando find é exatamente a ferramenta certa para o trabalho. Observe que find é um comando externo que pode funcionar de duas maneiras: pode gerar uma lista de arquivos e executar comandos para cada arquivo. Se você quiser executar um comando para cada arquivo, use -exec :
find . -type f -name '*.txt' -exec chmod a+r {} +
1 Entre os shells não-Bourne, fish e tcsh também têm o recurso