Пытаться:
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
должен быть в двойных кавычках для защиты от разбиения слов и расширения пути.