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