Иногда может возникнуть необходимость скопировать скрытые файлы или папки из одного места в другое. В Linux скрытые файлы характеризуются точкой (.) в начале имени файла. Типичный пример - копирование домашнего каталога пользователя или директории с веб-сайтом, так как эти каталоги часто содержат множество скрытых файлов.
При копировании одного скрытого файла всё работает без проблем. Однако сложности возникают при попытке скопировать несколько файлов с использованием шаблона *. Этот шаблон не учитывает символ точки (.), в результате чего все скрытые файлы исключаются из процесса копирования. Такое поведение было специально разработано, чтобы избежать непреднамеренной рекурсии. Рекурсия могла возникнуть если бы програма пыталась копировать скрытые ссылки на текущую директорию (.) и родительскую директорию (..).
Тем не менее, существуют способы обойти это ограничение. Можно скопировать содержимое папки без использования *. Например, давайте создадим папку app с файлами .htaccess и index.php и папку backup, куда нужно скопировать файлы. Можно использовать ссылку на текущую папку, и тогда cp скопирует всё содержимое, включая скрытые файлы, в нужную директорию:
cp -r app/. backup
В качестве альтернативы можно также явно указать, что вы хотите скопировать содержимое папки, переданной в первом параметре, используя опцию -T:
cp -rT app backup
Эта команда также требует опции -r для рекурсивной обработки папок, поскольку первый параметр указывает на папку, а не на список файлов.
Наконец, если вы хотите скопировать только скрытые файлы из директории, можно использовать следующий синтаксис с символами подстановки:
cp app/.* backup
Однако избегайте добавления опции -r к этой команде. Если её включить, команда попытается скопировать не только указанную директорию, но и все директории выше по иерархии, включая корневой каталог системы, что может привести к нежелательным последствиям.