3

Я хочу скопировать все файлы во всех каталогах в родительский каталог, но я получаю сообщение об ошибке

./img/* is not a directory

Например. Вот команда, которую я использовал. Есть лучший способ сделать это?

find . -type d -regex './[a-z]*' -exec cp -v {}/* .. \;

2 ответа2

2

Пытаться:

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

1

Это также может работать

cd your_directory
cp -rp * /absolut_path_to_parent_directory

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .