Direi che un modo potrebbe essere di usare find, usando un comando del tipo
codice:
# la directory dove ci sono i sorgenti poniamo che sia in una variabile
# che sia chiama bazfoo e la directory destinazione nella variabile foobaz

find ${bazfoo} \( -name *.c -o -name *.java \) -exec cp \{\}  ${foobaz} \;

# oppure

find ${bazfoo} \( -name *.c -o -name *.java \) | xargs cp -t ${foobaz}
questi due comandi dovrebbero funzionare, a meno che non ci siano file con lo stesso nome o tu non debba riscreare la struttura originale delle directory nella cartella destinazione, nel caso così su due piedi non mi viene in mente niente.