4

Я хочу скопировать все файлы с именем XYZ * в одну папку. Проблема в том, что файлы находятся в разных подпапках и что даже глубина структуры папок не одинакова для всех файлов. К счастью, по крайней мере каждый файл имеет уникальное имя.

Конечно, я подумал о команде cp, но думаю, что глубина структуры папок должна быть одинаковой, чтобы это работало.

3 ответа3

7

Если вы хотите избежать запуска многих отдельных процессов (как это может сделать использование find ... -exec cp ... ) с использованием bash (и у вас нет zsh для его ** формы), вы можете сделать один cp следующим образом:

cp -p $(find path/to/src -name 'XYZ*') path/to/dest

Форма $(...) является версией процесса подстановки в обратном тиканье. Ниже приведен пример.

find . -name 'd*a'
cp -p $(find . -name 'd*a') ../zeta
ls ../zeta

Эти команды дали следующий вывод:

./.?/dx2a
./.?/dx4a
./.tdot1/dx1a
./.tdot2/dx2a
cp: will not overwrite just-created `../zeta/dx2a' with `./.tdot2/dx2a'
dx1a  dx2a  dx4a
2

Вы можете использовать find для этого:

$ find path/to/src -type f -name XYZ\* -exec cp -p {} path/todest/ \;
1

Если вы используете zsh вместо bash, вы можете сделать это с помощью шаблона ** file glob. Это рекурсивно соответствует всем подпапкам.

cp path/to/src/**/XYZ* path/to/dest

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