Você pode usar um loop de shell que executa diff para cada arquivo, embora isso não capture os casos em que d2 contém um arquivo, mas d1 não. Pode ser o suficiente.
for file in d1/*.cpp; do
diff "$file" "d2/${file##*/}"
done
Ou tudo em uma linha:
for file in d1/*.cpp; do diff "$file" "d2/${file##*/}"; done
A parte ${file##*/}
é uma expansão de parâmetro especial.
Se a variável de arquivo contiver d1/hello.cpp
, então "${file##*/}"
será expandido para hello.cpp
(o valor do arquivo, mas com tudo até e incluindo, o último / removido).
Portanto, "d2/${file##*/}"
resultará em d2/hello.cpp
e o comando resultante diff será, portanto, diff d1/hello.cpp d2/hello.cpp
Veja link para mais informações sobre manipulações de strings no bash.
Em uma nota lateral, um sistema de controle de versão (como subversion, git, mercurial etc ...) tornaria esse tipo de diffing muito mais fácil.