Подтвердить что ты не робот

Команда cp должна игнорировать некоторые файлы

Иногда мне нужно выполнить следующую команду

cp -rv demo demo_bkp

Однако я хочу игнорировать все файлы в каталоге .git. Как мне это достичь? Для копирования файлов .git требуется много времени, и мне не нужны эти файлы.

4b9b3361

Ответ 1

Чтобы игнорировать каталог git, я сначала попробовал git export.

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

rsync -rv --exclude=.git demo demo_bkp

См. справочная страница для получения дополнительной информации.

Ответ 2

OK. Подцепите себя. Это не очень.

find demo -depth -name .git -prune -o -print0 | cpio -0pdv --quiet demo_bkp

Что здесь происходит?

  • find demo | cpio -p demo_bkp находит файлы, соответствующие любым критериям, которые вы хотите, и использует cpio для их копирования (так называемый "сквозной" режим).

  • find -depth изменяет порядок печати файлов в соответствии с запросом cpio.

  • find -name .git -prune указывает, что не следует перезаписывать каталоги .git.

  • find -print0 | cpio -0 нашел NUL-символы (\0) для разделения имен файлов. Это для максимальной надежности в случае, если есть какие-то странно названные файлы с пробелами, символами новой строки или другими необычными символами.

  • cpio -d создает каталоги по мере необходимости.

  • cpio -v --quiet печатает каждое имя файла, в то время как опускает сообщение "X блоков, скопированное", cpio обычно печатает в конце.

Ответ 3

Я думаю, что это сделает трюк:

cd demo
find . -not -path \*/.\* -type d -exec mkdir -p -- ../demo_bkp/{} \;
find . -not -path \*/.\* -type f -exec cp -- {} ../demo_bkp/{} \;

Сначала находит и создает каждый каталог. Затем находит и копирует каждый файл.

Обратите внимание, что это не будет работать со специальными файлами (символическими ссылками и т.д.).