Если бы я хотел скопировать все *.so
файлы из src
в, dst
я бы сделал:
cp src/*.so dst
Однако я хочу скопировать все *.so
файлы из src и его подкаталогов в dst
. Есть какие-нибудь подсказки?
Пытаться:
find src/ -type f | grep -i so$ | xargs -i cp {} dst
find
может делать сопоставление с образцом и выполнять команды. Там нет необходимостиfind src/ -type f -name '*.so' -exec cp '{}' dst/ ';'
grep
намного перевешивают простые шаблоны оболочки, используемые в-name
параметреfind
.xargs
также гораздо более мощный, чем-exec
параметрfind
.Если вы используете Bash, вы можете включить
globstar
опцию оболочки для рекурсивного сопоставления файлов и каталогов:Если вам нужно найти файлы, имена которых начинаются с
.
, и / или файлы в каталогах и под ними, имена которых начинаются с.
, установите этуdotglob
опцию (например, сshopt -s dotglob
). Вы можете установить их обоих одной командой:источник
Я попробовал команду, предложенную Майком:
но в итоге все файлы были выгружены в каталог
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Еще один способ сделать это так:
источник
cp
процессов:... -exec cp -t dst/ {} +
.-exec
с;
,{}
заменяется на один путь , в то время. Вы получаете отдельныйcp
для каждого файла. С+
синтаксисомfind
заменяет{}
несколько результатов (вплоть до определенного системой предела длины командной строки; ограничение:{}
должно быть последним, что раньше+
, следовательноcp -t
). Создание и завершение процесса - вещь относительно дорогая. По этой причине это хорошо использовать,+
когда вы ожидаете много результатов. В этом случае копирование большого количества файлов в любом случае может занять много времени, поэтому разница может остаться незамеченной; тем не менее, это хорошая практика.Grep можно заменить с помощью команды find's -name :
источник