Tente:
find . -type d -regex './[a-z]*' -exec bash -c 'cp -v "$1"/* ..' Cp {} \;
Discussão
Considere:
find . -type d -regex './[a-z]*' -exec cp -v {}/* .. \;
Quando o bash vê essa linha, ele executa a expansão do nome do caminho em {}/* . Como não há diretório chamado {} , o * é deixado como um literal * . Isto não é o que você quer. Você precisa que a expansão do nome de caminho ocorra após find ter substituído {} . Colocando o comando cp entre aspas e passando-o como um argumento para bash -c , alcançamos esse objetivo.
Um exemplo de formulário para bash -c se parece com:
bash -c 'code...' a b c
Isso diz ao bash para atribuir a a $0 , b a $1 , c a $2 e, em seguida, executar code... . Quando ocorre um erro, o shell usa $0 como o nome do programa que está sendo executado. Acima, escolhemos Cp como um nome descritivo. Além disso, como acima, {} é substituído por $1 e usamos $1 no code... . Quando usado dessa maneira, {} deve ser deixado sem aspas: find manipula qualquer escape necessário. No interior code... , no entanto, $1 deve estar entre aspas duplas para proteger contra a divisão de palavras e a expansão do nome de caminho.