3

Я (аб?)использование команды 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 ответа2

2

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

rsync источник / экспорт / --exclude '* .svn'

Если вам нужно также удалить из экспорта файлы, удаленные из источника /, добавьте параметр --delete в команду.

2

Если вы не можете использовать rsync в ответ на jhcaiced (+1), вы можете сделать это несколькими способами:

  1. скопируйте каталог одним cp -r а затем удалите все каталоги .svn, используя find . -name .svn -delete`
  2. передать один tar c другому tar x . Tar имеет --exclude=

Вы также можете оптимизировать свой код. Обратите внимание, что вы вызываете cp для каждого файла. Это занимает много времени. Вы можете использовать -print0 и xargs -0 . Это будет намного быстрее.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .