Вопрос или проблема
Я хочу скопировать директории на другой сервер, однако мне не нужно копировать файлы этих директорий. Поэтому я ищу способ создать архив с пустыми директориями.
Вот команда, которая вам нужна:
find . -type d -print0 | tar cf folderstructure.tar --null --files-from - --no-recursion
Она создаёт файл folderstructure.tar
с структурой папок без файлов.
Используйте cpio
, а не tar
для этой задачи. Сначала выполните cd
в верхний уровень директории, которую вы хотите скопировать.
find . -type d -print0 | cpio -o -0 > /tmp/archive.cpio
Затем скопируйте /tmp/archive.cpio
на ваш удалённый хост. Вы можете сделать это за один шаг:
find . -type d -print0 | cpio -o -0 | ssh user@remotehost "cd targetdir; cpio -i"
Кстати, параметры -print0
и -0
полезны/необходимы, когда имена файлов содержат непечатаемые символы, т.е. символы новой строки.
Проблема tar
заключается в том, что он использует текущего пользователя в качестве владельца при создании директорий. Расширяя ответ @Otheus, команда cpio
для дублирования желаемой структуры директорий с заранее выбранным владельцем, например, ftpuser
и ftpgroup
, будет такой:
для сохранения:
find sourcefolder -type d -print0 | cpio -o -0 > ~/folderstructure.cpio
для восстановления:
cd targetfolder
cat ~/folderstructure.cpio | sudo cpio --owner ftpuser.ftpgroup -i
Ответ или решение
Для создания архива только с пустыми каталогами без файлов вам подойдут команды tar
или cpio
. Я подробно объясню оба этих метода, включая их использование и некоторые дополнительные параметры.
Метод 1: Использование tar
Команда для создания архива с пустыми директориями с помощью tar
выглядит следующим образом:
find . -type d -print0 | tar cf folderstructure.tar --null --files-from - --no-recursion
Пояснения к команде:
find . -type d -print0
— эта команда находит все директории в текущем каталоге и выводит их с разделителем нулевой длины (что полезно для обработки имен с пробелами и специальными символами).tar cf folderstructure.tar
— создает архивfolderstructure.tar
.--null
— указываетtar
использовать нулевой байт в качестве разделителя.--files-from -
— сообщаетtar
, что список файлов (в данном случае директорий) будет передан через стандартный ввод.--no-recursion
— предотвращает рекурсивное добавление файлов в архив.
Таким образом, команда создаст архив с пустыми директориями.
Метод 2: Использование cpio
Вы также можете использовать cpio
, что может быть более гибким в некоторых случаях. Вот пример:
find . -type d -print0 | cpio -o -0 > /tmp/archive.cpio
Пояснения к команде:
-o
— указываетcpio
, что мы хотим создать архив.-0
— позволяет обрабатывать имена файлов с нулевым разделителем.>
перенаправляет вывод в файл/tmp/archive.cpio
.
Чтобы скопировать архив на удаленный сервер, можно использовать команду:
find . -type d -print0 | cpio -o -0 | ssh user@remotehost "cd targetdir; cpio -i"
Где user@remotehost
— это ваш удаленный сервер, а targetdir
— каталог, в который вы хотите выполнить восстановление.
Настройка владельца и группы
В случае, если вам необходимо установить определенного владельца и группу для директорий, вы можете использовать cpio
следующим образом:
Для сохранения структуры:
find sourcefolder -type d -print0 | cpio -o -0 > ~/folderstructure.cpio
Для восстановления с указанием владельца и группы:
cd targetfolder
cat ~/folderstructure.cpio | sudo cpio --owner ftpuser.ftpgroup -i
Пояснения:
- В этом случае
ftpuser
иftpgroup
— это нужные вам имя пользователя и группа, которые будут назначены созданным директориям.
Заключение
Оба метода позволяют создать архив только с директориями, однако cpio
может предоставить больше возможностей в управлении владельцем файлов. Выбор между tar
и cpio
может зависеть от ваших конкретных требований и предпочитаемых методов работы.