В shell звёздочка выглядит как простой способ скопировать всё содержимое папки.
Например, так часто переносят конфиги, сборку или шаблон проекта:
cp -r ./src/* ./dst/
Но обычный glob * не включает скрытые файлы, имена которых начинаются с точки.
То есть такие файлы могут не попасть в копию:
.env
.gitignore
.dockerignore
.editorconfig
Для локального проекта это неприятно, а для деплоя или Docker build может стать настоящей проблемой. Приложение уедет без .env.example, Docker получит лишний build context, а форматтеры и линтеры будут вести себя иначе.
Один из надёжных вариантов использовать rsync со слешем в конце источника:
rsync -a ./src/ ./dst/
Так копируется именно содержимое директории, включая dotfiles.
Перед опасной синхронизацией можно сначала посмотреть план:
rsync -an ./src/ ./dst/
Ключ -n включает dry-run и показывает, что будет скопировано без реальных изменений.
Если хочется остаться на cp, можно явно копировать директорию целиком:
cp -a ./src/. ./dst/
Точка после src означает содержимое папки, а не только элементы, которые поймал glob.
В Bash есть и настройка dotglob:
shopt -s dotglob
cp -r ./src/* ./dst/
Но её лучше использовать осторожно, потому что она меняет поведение glob в текущем shell.
Для копирования содержимого папки вместе со скрытыми файлами чаще всего удобнее rsync -a ./src/ ./dst/ или cp -a ./src/. ./dst/.
➡️ DevOps Ready | #совет
