Пытаться:
find . -type d -regex './[a-z]*' -exec bash -c 'cp -v "$1"/* ..' Cp {} \;
обсуждение
Рассматривать:
find . -type d -regex './[a-z]*' -exec cp -v {}/* .. \;
Когда bash видит эту строку, он выполняет раскрытие пути к {}/* . Поскольку (как правило) нет каталога с именем {} , * остается как литерал * . Это не то, что вы хотите. Вам нужно расширение пути, чтобы произойти после того, как find заменил {} . Поместив команду cp в кавычки и передав ее в качестве аргумента bash -c , мы достигаем этой цели.
Пример формы для bash -c выглядит так:
bash -c 'code...' a b c
Это говорит bash назначить a $0 , b на $1 , c на $2 а затем выполнить code... Если возникает ошибка, оболочка использует $0 в качестве имени выполняемой программы (в сообщении об ошибке). Выше мы выбрали Cp в качестве описательного имени. Также, как указано выше, {} заменяет $1 и мы используем $1 в code... При использовании таким способом {} не нужно заключать в кавычки (но это не повредит, если вы это сделаете); find дескрипторы любой побег, который необходим. Внутри code... однако, $1 должен быть в двойных кавычках для защиты от разбиения слов и расширения пути.