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/WD
em 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 loopbash
while
, que extrai os diretórios correspondentes um por vez, armazenando-os em uma variávela
. -
Dentro do loop:
- A instrução
if
verifica se o arquivoData.log
não está no diretório que está sendo considerado. Na instruçãoif
,$a
é expandido para que$a/Data.log
seja 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
(!
isNOT
e-f
indica 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$a
será 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.