Відповіді:
Спробуйте:
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 повинні бути в подвійних лапках для захисту від розбиття слів і розширення шляху.