Wildcard не працює в команді cp при використанні exec


3

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

./img/* is not a directory

Наприклад. Ось команда, яку я використав. Чи є кращий спосіб зробити це?

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

Відповіді:


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


Велике спасибі! Не могли б ви пояснити, чому він працює зараз?
m0meni

@ AR7 Я тільки що оновив відповідь. Дайте мені знати, якщо це допоможе.
John1024

Це дуже допомагає. Ви зробили мій день.
m0meni

1

Це також може працювати

cd your_directory
cp -rp * /absolut_path_to_parent_directory
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.