Як я можу пришвидшити селективну команду глибокої копії в unix?


3

Я (ab?) Використовує команду unix 'find' для рекурсивного експорту файлів із дерева каталогів, завалених каталогами .svn. Ця команда запускає багато часу. Чи є більш швидкий спосіб здійснити те саме?

find source/ -type f -and ! -path '*.svn*' -and -exec cp {} export \;

Що я хочу зробити, це пошук у кожному підкаталозі в дереві каталогів, починаючи з source/, і копіювати будь-які файли з цих каталогів у exportкаталог, пропускаючи будь-які файли, що знаходяться в каталогах .svn


Оновлення: (повне рішення, засноване на відповіді, яку опублікував Міхал Шрайер ):

find source/ -type f -and ! -path '*.svn*' -and -print0 | xargs -0 \
    cp --target-directory=export

Для тих, хто цікавиться: xargs у Вікіпедії.

Відповіді:


2

Якщо ви не можете використовувати rsyncвідповідь jhcaiced (+1), це можна зробити кількома способами:

  1. скопіюйте каталог з одного, cp -rа потім видаліть усі .svn dirs за допомогою find . -name .svn-delete`
  2. труба одна tar cдо іншої tar x. Дьоготь має--exclude=

Ви також можете оптимізувати свій код. Зауважте, що ви телефонуєте cpдля кожного файлу. Це займає тривалий час. Ви можете використовувати -print0і xargs -0. Це буде набагато швидше.


Ваша пропозиція використовувати -print0та xargs -0гарно працювати. Дякую!
e.James

@ e.James: ласкаво просимо
Michał Šrajer

2

Ви можете уникнути копіювання одних і тих самих файлів за допомогою rsync, команда буде чимось на зразок:

rsync джерело / експорт / --exclude '* .svn'

Якщо вам також потрібно видалити з експорту файли, видалені з джерела /, тоді додайте до команди параметр --delete.


+1, але чи збереже це структура каталогу? Я намагаюся не зберігати цю структуру. тобто не exportповинен містити підкаталогів, лише великий список файлів
e.James
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.