Если бы я хотел скопировать все *.soфайлы из srcв, dstя бы сделал:
cp src/*.so dst
Однако я хочу скопировать все *.soфайлы из src и его подкаталогов в dst. Есть какие-нибудь подсказки?
Если бы я хотел скопировать все *.soфайлы из srcв, dstя бы сделал:
cp src/*.so dst
Однако я хочу скопировать все *.soфайлы из src и его подкаталогов в dst. Есть какие-нибудь подсказки?
Ответы:
Пытаться:
find src/ -type f | grep -i so$ | xargs -i cp {} dst
grepнамного перевешивают простые шаблоны оболочки, используемые в -nameпараметре find. xargsтакже гораздо более мощный, чем -execпараметр find.
Если вы используете Bash, вы можете включить globstar опцию оболочки для рекурсивного сопоставления файлов и каталогов:
shopt -s globstar
cp src/**/*.so dst
Если вам нужно найти файлы, имена которых начинаются с ., и / или файлы в каталогах и под ними, имена которых начинаются с ., установите эту dotglobопцию (например, с shopt -s dotglob). Вы можете установить их обоих одной командой:
shopt -s globstar dotglob
Я попробовал команду, предложенную Майком:
find src/ -type f | grep -i so$ | xargs -i cp {} dst
но в итоге все файлы были выгружены в каталог dstс потерянными относительными путями.
Чтобы сохранить относительные пути, команду необходимо изменить следующим образом:
find src/ -type f | grep -i so$ | xargs -i cp {} dst/{}
dst. Если это не так, используйте cp --parents. Кроме того, не забудьте процитировать имена файлов. Таким образом: ... | xargs -i cp --parents "{}" dst(обратите внимание, что последний аргумент cpтеперь является «просто» целевым каталогом). Команда может быть еще короче (и , вероятно , быстрее) , используя -tфлаг: ... | xargs cp --parents -t dst.
... | xargs cp {} --parents -t dst.
--parentsнедоступен. Я использовал dittoвместо него: stackoverflow.com/questions/11246070/cp-parents-option-on-mac
Еще один способ сделать это так:
find src/ -type f -name "*.so" -exec cp {} dst/ \;
cpпроцессов: ... -exec cp -t dst/ {} +.
-execс ;, {}заменяется на один путь , в то время. Вы получаете отдельный cpдля каждого файла. С +синтаксисом findзаменяет {}несколько результатов (вплоть до определенного системой предела длины командной строки; ограничение: {}должно быть последним, что раньше +, следовательно cp -t). Создание и завершение процесса - вещь относительно дорогая. По этой причине это хорошо использовать, +когда вы ожидаете много результатов. В этом случае копирование большого количества файлов в любом случае может занять много времени, поэтому разница может остаться незамеченной; тем не менее, это хорошая практика.
Grep можно заменить с помощью команды find's -name :
find src/ -type f -name "*.so" | xargs -i cp {} dst/{}
findможет делать сопоставление с образцом и выполнять команды. Там нет необходимостиfind src/ -type f -name '*.so' -exec cp '{}' dst/ ';'