Якби я хотів , щоб скопіювати всі *.so
файли з src
в dst
я зроблю:
cp src/*.so dst
Тим НЕ менше, я хочу , щоб скопіювати всі *.so
файли з СРКА і це підкаталоги в dst
. Будь-які підказки?
Якби я хотів , щоб скопіювати всі *.so
файли з src
в dst
я зроблю:
cp src/*.so dst
Тим НЕ менше, я хочу , щоб скопіювати всі *.so
файли з СРКА і це підкаталоги в 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 -name :
find src/ -type f -name "*.so" | xargs -i cp {} dst/{}
find
може робити узгодження шаблонів та виконувати команди. Немає необхідності передавати його вихід:find src/ -type f -name '*.so' -exec cp '{}' dst/ ';'