Иногда мне нужно выполнить следующую команду
cp -rv demo demo_bkp
Однако я хочу игнорировать все файлы в каталоге .git. Как мне это достичь? Для копирования файлов .git требуется много времени, и мне не нужны эти файлы.
Иногда мне нужно выполнить следующую команду
cp -rv demo demo_bkp
Однако я хочу игнорировать все файлы в каталоге .git. Как мне это достичь? Для копирования файлов .git требуется много времени, и мне не нужны эти файлы.
Чтобы игнорировать каталог git, я сначала попробовал git export
.
Но в общем случае, чтобы скопировать дерево каталогов, исключая определенные файлы или папки, я рекомендую использовать rsync
вместо cp
. Синтаксис в основном тот же, но rsync
имеет больше возможностей, в том числе один для исключения выбранных файлов:
rsync -rv --exclude=.git demo demo_bkp
См. справочная страница для получения дополнительной информации.
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 обычно печатает в конце.
Я думаю, что это сделает трюк:
cd demo
find . -not -path \*/.\* -type d -exec mkdir -p -- ../demo_bkp/{} \;
find . -not -path \*/.\* -type f -exec cp -- {} ../demo_bkp/{} \;
Сначала находит и создает каждый каталог. Затем находит и копирует каждый файл.
Обратите внимание, что это не будет работать со специальными файлами (символическими ссылками и т.д.).