Dado
$ tree somepath/
somepath/
├── Dir1
│ ├── Sub1
│ │ └── Sub1.jpg
│ └── Sub2
│ ├── Sub2.jpg
│ ├── Sub2.png
│ └── Sub2.txt
├── Dir2
│ ├── Sub1
│ │ ├── Sub1.doc
│ │ └── Sub1.txt
│ └── Sub2
│ ├── SomeTxt.txt
│ ├── Sub2.jpg
│ └── Sub2.png
├── Dir3
│ └── Dir3.txt
└── Dir4
├── Some.txt
└── Sub1
└── Dir4.txt
9 directories, 12 files
depois, com a opção globstar do shell ativada ( shopt -s globstar
)
for d in somepath/**/; do
d="${d%/}"
[[ -f "${d}/${d##*/}.txt" ]] && printf "%s\n" "$d"
done
somepath/Dir1/Sub2
somepath/Dir2/Sub1
somepath/Dir3
Se você quiser armazenar os resultados em uma matriz para processamento posterior, você pode fazer isso usando o mapfile
do shell (ou seu sinônimo readarray
), por exemplo,
mapfile -t TXT_DIRS < <(
for d in somepath/**/; do
d="${d%/}"
[[ -f "${d}/${d##*/}.txt" ]] && printf "%s\n" "$d"
done
)
OBSERVAÇÃO: seria melhor praticar terminar a lista nula usando um dos métodos discutidos em bash: uso processual seguro de espaço de localização em
Você pode, então, iterar pelo array assim
for d in "${TXT_DIRS[@]}"; do
echo "$d"
done
somepath/Dir1/Sub2
somepath/Dir2/Sub1
somepath/Dir3
Como alternativa, você pode evitar o armazenamento dos resultados e simplesmente processar cada diretório à medida que o encontra, por exemplo
for d in somepath/**/; do
d="${d%/}"
[[ -f "${d}/${d##*/}.txt" ]] && echo "Doing something with $d"
done
Doing something with somepath/Dir1/Sub2
Doing something with somepath/Dir2/Sub1
Doing something with somepath/Dir3