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.