Если бы я хотел скопировать все *.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/ ';'