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
find
cedo, usando-quit
quando recebemos uma correspondência. Isso pode economizar tempo em grandes árvores de sistema de arquivos. - O teste
-regex
corresponde 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
-iregex
em vez de-regex
para 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