Якби я хотів , щоб скопіювати всі *.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/ ';'