Usando a ótima resposta do @Nifle, mas incluindo seus detalhes, tente:
% find /Volumes/WD -type d -name *[TEST]* | while read a; do if [ ! -f $a/Data.log ]; then echo $a; fi; done
Quebrando este verso:
-
find /Volumes/WD -type d -name *[TEST]*: Anda na árvore de arquivos de/Volumes/WDem seu HD externo procurando diretórios (-type d) que têm[TEST]em algum lugar em seu nome (-name *[TEST]*). -
A saída do comando
findé canalizada (por|) para o loopbashwhile, que extrai os diretórios correspondentes um por vez, armazenando-os em uma variávela. -
Dentro do loop:
- A instrução
ifverifica se o arquivoData.lognão está no diretório que está sendo considerado. Na instruçãoif,$aé expandido para que$a/Data.logseja um caminho como/Volumes/WD/<dir1>/<dir2>/Data.log. Para obter o teste, você está interessado em!e-f, de forma que apenas casos em que não exista um arquivo com esse nome serão avaliados comoTRUE(!isNOTe-findica um arquivo em vez de qualquer outro tipo de entrada no sistema de arquivos, como diretórios ou links). - Finalmente, se encontrarmos um diretório correspondente, ele será impresso por
echo $a, em que$aserá substituído, conforme acima, pelo nome do diretório canalizado defind.
- A instrução
Eu sei que estou refazendo uma resposta anterior, mas espero que isso esclareça o que está acontecendo no grande one-liner apresentado pela @Nifle e resolva seu problema.