System Administration Toolkit: Перемещение дерева каталогов в ОС UNIX

Иногда требуется скопировать целиком дерево каталогов UNIX® внутри одной системы или между различными компьютерами. Есть много методов для выполнения этой задачи, но не все из них гарантируют получение корректных результатов или совместимы с различными системами. Эта статья рассматривает различные варианты копирования дерева каталогов, доступные в UNIX-системах и наилучшие способы их применения.

Мартин Браун, внештатный автор, консультант

Мартин Браун (Martin Brown) пишет статьи уже более семи лет. Он является автором многочисленных книг и статей по различным темам. Его квалификация охватывает множество платформ и языков разработки - Perl, Python, Java™, JavaScript, Basic, Pascal, Modula-2, C, C++, Rebol, Gawk, Shellscript, Windows®, Solaris, Linux, BeOS, Mac OS X и т.д., а также Web-программирование, системное управление и интеграция. Мартин является внутренним экспертом (SME) компании Microsoft® и регулярно пишет для ServerWatch.com, LinuxToday.com и IBM developerWorks. Он также принимает участие в блогах Computerworld, The Apple Blog и на других сайтах. Связаться с ним можно через его Web-сайт.



26.09.2008

Об этом цикле статей

Обычно администратор UNIX® применяет стандартный набор утилит и приемов. Эти утилиты, последовательности командных строк и скрипты используются для упрощения различных процессов. Некоторые из этих инструментальных средств поставляются вместе с операционной системой, но знание большинства приемов приходит с опытом работы и желанием системных администраторов облегчить себе жизнь. Этот цикл статей сфокусирован на изучении лучших инструментальных средств разных вариантов UNIX, включая методы упрощения процесса администрирования в гетерогенной среде.


Использование cp

Стандартная команда cp с использованием опции -rспособна копировать целиком дерево каталогов в указанную папку. Некоторые версии ОС UNIX и GNU-верcии утилиты cp с графическим интерфейсом пользователя поддерживают опцию -R, при помощи которой осуществляется копирование выбранных каналов, ссылок и других файлов.

В самом простом своем варианте команда cp может копировать выбранный каталог в новый каталог с отличным от первого именем (см. листинг 1).

Листинг 1. Команда cp -- копирование выбранного Вами каталога в новую папку с именем, отличным от имени копируемого каталога
$ cp -r srcdir destdir

Однако, нужно аккуратно задавать имена исходных файлов и каталогов, куда будет осуществлено копирование, при использовании команды cp, поскольку способ, которым они будут обработаны, может значительно повлиять на результат. Например, предположим, что нужно скопировать каталог /home/mc в каталог /export/home/mc. Если каталог /export/home/mc не существует, тогда команда, приведенная в листинге 2 скопирует каталог /home/mc в /export/home/mc, предварительно создав его.

Листинг 2. Указание копируемых файлов и целевых папок при помощи команды cp
$ cp -r /home/mc /export/home/mc

Однако если /export/home/mc уже существует, тогда код из листинга 2 осуществит копирование каталога /home/mc во вновь созданный вложенный каталог /export/home/mc/mc.

Для копирования содержимого существующего каталога в уже существующий каталог, выберите файлы в исходном каталоге, как показано в листинге 3.

Листинг 3. Копирование содержимого одного каталога в другой, предварительно созданный, каталог
$ cp -r /home/mc/* /export/home/mc

Очень полезная опция -p команды cp - она гарантирует сохранение существующих прав на доступ к файлу и информации пользователю, которому этот файл принадлежит.


Использование tar

Команда tar изначально предполагалась для записи архивов данных на кассету. Например, Вы можете скопировать файлы из каталога на кассету командой, как в листинге 4.

Листинг 4. Копирование файлов из выбранного каталога в текущий каталог на кассете при помощи tar
$ tar cf /dev/rmt0 .

Листинг 4 можно разбить на следующие шаги:

  • Опция c создает новый архив.
  • Опция f в управляющей последовательности задает целевую папку для копирования. В нашем случае это первый ленточный привод (/dev/rmt0). Также можно создать tar-файл, куда будет записана вся информация.
  • Символ . указывает команде tar, что надо произвести запись в архив каждого файла в текущем каталоге и его подкаталогах, если такие имеются.

Однако, вместо того, чтобы копировать данные на ленту, с помощью tar можно сохранить данные прямо в файл. Или, что даже более удобно, можно копировать файлы в стандартный поток вывода и, используя затем конвейер, извлечь файлы из этого потока и скопировать их таким образом из одного каталога в другой. Команда tar более подходит для копирования и восстановления файлов с нестандартными разрешениями на системах, в которых команда cp не поддерживает опцию -R.

Например, листинг 5 показывает, как копировать файлы из выбранного каталога в уже созданный каталог.

Листинг 5. Копирование файлов из каталога в каталог, который уже существует
$ tar cf - . | (cd DIR; tar xf - )

Листинг 5 может быть разбит на следующие шаги:

  • tar cf - . создает архив файлов в текущем каталоге, который отправляется на стандартный поток вывода.
  • cd DIR изменяет каталог. Заметьте, что этот каталог должен существовать, чтобы в него можно было копировать файлы.
  • tar xf - извлекает файлы из стандартного потока ввода.
  • Если заключить две предыдущие команды в круглые скобки, то они будут обработаны более эффективно как одна команда с предварительным вызовом командыchange directory перед извлечением архива.
  • Канал "|", заключенный между двумя фрагментами командной строки, обеспечивает перенаправление стандартного потока вывода первой команды tar в стандартный поток ввода второй команды tar, осуществив, по сути, копирование данных в "несуществующий" архивный файл с последующим извлечением из него данных.

Команда tar сохранит полный путь к файлу, включенному в архив, если его задать явно. Команды листинга 6 копируют файлы в архив с сохранением их полного пути, что не позволит их извлечь где-либо, кроме как в их исходном каталоге.

Листинг 6. Явное задание пути
$ tar cf  myhome.tar /home/mc

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

Листинг 7. Добавление файлов из текущего каталога
$ cd /home/mc
$ tar cf myhome.tar .

Команда tar лучше команды cp потому что при использовании опции v дает возможность контролировать процесс передачи файлов от исходного каталога в целевой. Обычно лучше использовать эту опцию вместе с командой, которая извлекает файлы, а не создает их (cp), поскольку такая команда гарантирует то, что файлы будут скопированы корректно, нежели выяснять потом, был ли правильно прочитан файл (см. листинг 8).

Листинг 8. Использование опции v
$ tar cf - .|(cd /tmp/mc; tar xvf -)
./
./.bash_aliases
./.bash_history
./.bash_path
./.bash_profile
./.bash_vars
./.bashrc
./xmlsimple.pl
./rest.xml
...

Если tar на конкретной системе не поддерживает длинные пути, то это значит, что это устаревшая версия утилиты. GNU-версия tar поддерживает новые форматы tar и длинные пути к файлам.

По умолчанию большинство разновидностей команды tar корректно осуществляют копирование и создание файлов и каталогов с теми же правами доступа и информацией о владельце, как у исходного файла. Однако некоторые версии tar могут изменить эту информацию (информацию о владельце) при извлечении файлов, если пользователь вошел с учетной записью администратора (root). Проверить, что все права доступа и информация о владельце не были изменены, можно с помощью опции p (см. листинг 9).

Листинг 9. Использование опции p
$ tar cpf - .|(cd /tmp/mc; tar xvpf -)

В заключение, можно создать новый каталог, куда копировать файлы, расширив вторую часть команды выше (см. листинг 10).

Листинг 10. Создание нового каталога для копирования в него файлов
$ tar cpf - .|(mkdir /tmp/mc; cd /tmp/mc; tar xvpf -)

tar - это очень полезный инструмент для копирования файлов и каталогов. Однако еще удобнее с помощью tar копировать файлы через сеть. Прежде чем описать эту возможность, поясним, как выполнять это действие, используя другой инструмент архивирования, а именно cpio.


Использование cpio

cpio идентичен tar, но при использовании cpio нужно задавать не только имя каталога, но и список имеющихся в нем файлов или подкаталогов. Это может быть полезно, когда надо скопировать только какие-то определенные файлы. Например, для создания cpio-архива, содержащего определенные папки, можно использовать листинг 11.

Листинг 11. Создание архива с указанными каталогами при помощи cpio.
$ ls ./dira ./dirc |cpio -ov > diranc.cpio

Первая часть команды, начинающаяся с ls, выводит список файлов (в этом случае двух каталогов), которые будут скопированы. Вторая часть - это команда cpio скопировать выбранные файлы в архив. Можно разбить эту команду на две отдельных:

  • Опция o копирует файлы в архив.
  • Опция v отображает список файлов, которые были скопированы, что будет полезно для проверки.

Собственно архив с данными можно получить перенаправив вывод команды cpio в новый файл.

Команда выше ограниченна по своим возможностям, поскольку будет копировать только те файлы, которые были непосредственно указаны. Лучший способ скопировать каталог целиком - это использовать команду find (см. листинг 12).

Листинг 12. Применение команды find для копирования каталога целиком
$ find . |cpio -ov >archive.cpio

Для извлечения файлов из cpio-архива нужно использовать опцию i. Также нужно использовать опцию d, чтобы убедиться, что каталоги в файле архива, которые не существуют в целевом каталоге, будут восстановлены в нем. Используя эти две опции вместе, можно копировать из одного каталога в другой, как показано в листинге 13.

Листинг 13. Одновременное использование опций i и d
$ find . |cpio -ov |(cd /tmp/mc; cpio -idv)
.
./.bash_aliases
./.bash_history
./.bash_path
./.bash_profile
./.bash_vars
./.bashrc
./xmlsimple.pl
./rest.xml
46 blocks
.
.bash_aliases
.bash_history
.bash_path
.bash_profile
.bash_vars
.bashrc
xmlsimple.pl
rest.xml
46 blocks

Так как режим работы с предоставлением подробной информации о файлах используется в обеих частях команды, то можно определить, соответствует ли размер архива извлеченного архиву уже созданному. В этом случае обе операции использовали 46 блоков.

Заметьте, что cpio не станет переписывать файлы в каталоге, если у них такое же, как и в архиве, или более позднее время последней модификации.


Копирование данных через сеть

Очевидный способ передачи файлов через сеть - это использование сетевой файловой системы Network File System (NFS) для подключения к удаленной директории и копирования в нее. Это очевидное решение, но не всегда возможное или применимое.

Простейший путь копировать файлы по сети - это использование команд tar или cpio для создания архивного файла, который затем можно передать через сеть. У этого метода есть несколько преимуществ, в том числе гибкость при определении того, как и когда копировать файлы, но имеются и некоторые недостатки - сложность процесса копирования и большие затраты дискового пространства для хранения дубликата набора файлов, поскольку сначала этот архив создается на исходной системе, а уже потом передается в целевую систему через сеть.

Как мы уже объясняли, создать архив достаточно просто:

Листинг 14. Создание архива
$ tar cf mydir.tar .

После этого можно копировать файл, используя любой подходящий способ, например, скопировать его посредством cp и NFS или передать на удаленную систему при помощи FTP или SFTP.

Однако передача архива это далеко не самый лучший метод. Гораздо эффективнее использовать сжатие.


Использование сжатия

Если архив создается при помощи cpio или tar и копируется в удаленный каталог через медленную сеть (например, WAN или Интернет), то ускорить копирование можно, если сжать архивный файл. От выбора правильного формата сжатия зависит уровень сжатия.

Можно осуществить сжатие архива следующим образом (см. листинг 15).

Листинг 15. Сжатие архива
$ tar cf mydir.tar .
$ bzip2 mydir.tar

Или можно сделать это при помощи команды, сжимающий архив с помощью конвейера (см листинг 16).

Листинг 16. Сжатие архива
$ tar cf - .| bzip2 >mydir.tar.bz2

Преимущество варианта из Листинга 16 состоит в том, что он работает во всех версиях tar, cpio или других утилитах архивирования. Если используется GNU-версия (GNU tar), то можно сжимать при помощи Gzip, который вызывается опцией z команды tar (см. листинг 17).

Листинг 17. Использование опции z с tar
$ tar zcf mydir.tar.gz .

Другой способ копировать каталоги через сеть между системами состоит в использовании решения, показанного в листинге 16, но в таком случае в качестве адресата используйте программу remote shell (rsh).


Копирование непосредственно через сеть

Можно выполнять копирование непосредственно через сеть конвейерной пересылкой вывода команды tar или cpio на удаленный shell, например remote shell (rsh) или secure shell (ssh). Выбор удаленной shell зависит от того, какие оболочки доступны в конкретной среде. Программа rsh является стандартной удаленной оболочкой, поддерживающей аутентификацию, но не шифрование; позднее разработанная программа ssh поддерживает как аутентификацию, так и шифрование данных.

Командная строка для обеих shell одинакова (см. листинг 18).

Листинг 18. Копирование непосредственно через сеть
$ tar cf - ./*|rsh remotehost tar xf - -C /remotedir

Эта команда идентична команде tar для копирования внутри одной системы за исключением второй части - вторая tar будет выполнена на удаленной системе. Команда из листинга 18 будет выполняться благодаря конвейеру двух подкоманд.

Помните, что в зависимости от конфигурации remote shell может понадобиться ввести пароль при регистрации на удаленной системе. Копирование непосредственно через сеть может быть выполнено и при помощи удаленной оболочки ssh как показано в листинге 19 с заданием параметров для аутентификации.

Листинг 19. Задание параметров для аутентификации на удаленной системе
$ tar cf - ./*|ssh user@remotehost tar xf - -C /remotedir

Для лучшей производительности в медленных сетях следует использовать сжатие, как показано в листинге 20.

Листинг 20. Использование сжатия при копировании непосредственно через сеть
$ tar czf - ./*|ssh user@remotehost tar xzf - -C /remotedir

Существуют облегченные версии для rsh и ssh, которые могут значительно упростить копирование удаленной системы. Например, рассмотрим применение rcp, упрощенной версии удаленной оболочки rsh в листинге 21.

Листинг 21.Копирование каталога с удаленной системы при помощи rcp
$ rcp -r filename remotehost:/remotedir

Нужно использовать опцию -r для рекурсивного копирования каталогов.

Команда scp, родственная к ssh, использует тот же синтаксис управляющей строки (см. листинг 22).

Листинг 22. Использование scp
$ scp -r filename remotehost:/remotedir

Осуществление синхронизации через сеть

Все решения, приведенные выше, были предназначены для копирования файлов в пределах одной системы или с локальной системы на удаленную через сеть. Однако в их основе лежит копирование каталогов целиком, даже в тех случаях, где это не особо нужно. Иногда нужно скопировать файлы, которые изменились уже после того, как их скопировали. В таком случае синхронизация предпочтительнее повторного копирования.

Если используется tar или cpio, то можно обеспечить синхронизацию, явно задав файлы, которые нужно включить в архив. Например, если синхронизация осуществляется посредством cron (планировщик задач), то можно использовать команду, подобную приведенной ниже, для создания архива, который содержит файлы, измененные за последний день (см. листинг 23).

Листинг 23. Создание архива с файлами, измененными за последний день
$ tar cf archive.tar `find . -mtime -1 -type f`

Команда find находит файлы, модифицированные за последний день. Я выбираю только файлы, поскольку если выбрать каталоги, тогда tar добавит к архиву все файлы, находящиеся в них, что наверняка окажется избыточным.

Для более эффективной синхронизации можно использовать бесплатную утилиту rsync, которая может передавать файлы через сеть. Она удобна при копировании и синхронизации файлов в медленных сетях.


Заключение

Существует множество инструментов для копирования файлов и деревьев каталогов в ОС UNIX, как внутри одной системы, так и через сеть между двумя различными системами. Какое инструментальное средство использовать - зависит от конкретной ситуации и среды. Я предпочитаю использовать tar, потому что это инструментальное средство наиболее совместимо с различными типами UNIX-систем, которыми мне приходится пользоваться. Для пользователей ОС Linux® существует полезная утилита scp, которая является стандартным компонентом большинства Linux-дистрибутивов.

Ресурсы

Научиться

Получить продукты и технологии

  • IBM trial software: ознакомительные версии программного обеспечения для разработчика, которые можно загрузить со страницы developerWorks.(EN)

Обсудить

Комментарии

developerWorks: Войти

Обязательные поля отмечены звездочкой (*).


Нужен IBM ID?
Забыли Ваш IBM ID?


Забыли Ваш пароль?
Изменить пароль

Нажимая Отправить, Вы принимаете Условия использования developerWorks.

 


Профиль создается, когда вы первый раз заходите в developerWorks. Информация в вашем профиле (имя, страна / регион, название компании) отображается для всех пользователей и будет сопровождать любой опубликованный вами контент пока вы специально не укажите скрыть название вашей компании. Вы можете обновить ваш IBM аккаунт в любое время.

Вся введенная информация защищена.

Выберите имя, которое будет отображаться на экране



При первом входе в developerWorks для Вас будет создан профиль и Вам нужно будет выбрать Отображаемое имя. Оно будет выводиться рядом с контентом, опубликованным Вами в developerWorks.

Отображаемое имя должно иметь длину от 3 символов до 31 символа. Ваше Имя в системе должно быть уникальным. В качестве имени по соображениям приватности нельзя использовать контактный e-mail.

Обязательные поля отмечены звездочкой (*).

(Отображаемое имя должно иметь длину от 3 символов до 31 символа.)

Нажимая Отправить, Вы принимаете Условия использования developerWorks.

 


Вся введенная информация защищена.


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=40
Zone=AIX и UNIX
ArticleID=341796
ArticleTitle=System Administration Toolkit: Перемещение дерева каталогов в ОС UNIX
publish-date=09262008