Com o GNU find , você pode testar cada diretório:
for i in "$dir"/*/
do
test -n "$(find "$i" -type f -regex '.*/test[^/]*' -print -quit)" \
&& echo "$i"
done
Isso pesquisa cada diretório por um arquivo que começa com test e imprime o diretório, se for encontrado.
Algumas coisas a serem observadas:
- Estou ignorando os subdiretórios que começam com
.; Se precisarem ser considerados, verifique as perguntas frequentes sobre Bash sobre como incluí-las sem também capturar.e... - Saímos
findcedo, usando-quitquando recebemos uma correspondência. Isso pode economizar tempo em grandes árvores de sistema de arquivos. - O teste
-regexcorresponde a todo o nome de caminho considerado porfind, portanto, se quisermos corresponder apenas ao nome da base, precisamos ter cuidado ao corresponder/. Podemos combinar em padrões curinga sem essa restrição (e sem exigir a descoberta do GNU), usando-filename. - Você pode usar
-iregexem vez de-regexpara uma correspondência sem distinção entre maiúsculas e minúsculas. - Você pode selecionar a sintaxe regex usando a opção
-regextype.
Para o padrão específico na pergunta, podemos usar curingas, por isso, torna-se:
for i in "$dir"/*/
do
test -n "$(find "$i" -type f -name 'rf*.img' -print -quit)" && echo "$i"
done