Использование UNIX: Часть 5. Манипуляции с файлами

Перемещайте файлы между разными компьютерами и управляйте этими файлами

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

Мартин Стрейчер, главный редактор, Linux Magazine

Мартин Стрейчер (Martin Streicher) -- главный редактор журнала Linux Magazine. Он имеет степень магистра компьютерных наук Университета Пардью (Purdue University) и с 1982 занимается программированием на языках Pascal, C, Perl, Java и (с недавнего времени) Ruby в UNIX-подобных операционных системах.



27.02.2008

В последние годы аппаратное обеспечение стало крайне дешевым. Гигабайт емкости жесткого диска стоит 0,5 долларов, 19-дюймовый ЖК-монитор стоит меньше 200 долларов, а компьютер с ОС UNIX® можно купить меньше чем за 1000 долларов. Даже специализированное серверное оборудование обеспечение для серверов превратилось в продукт, доступный по цене для широкого круга покупателей.

Низкие цены на оборудование позволяют средним и крупным компаниям выделить для каждой задачи отдельный компьютер. Более того, повысить вычислительную мощность стало крайне просто: подключить компьютер к сети, скопировать образа жесткого диска на новый, "чистый" компьютер (white box) и перезагрузить его. Каждому компьютеру для нормальной работы необходимо выполнение ряда условий: стабильное напряжение, хорошая вентиляция корпуса и грамотная техническая поддержка.

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

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

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

Утилита tar

Очевидно, что простейший путь обеспечить непротиворечивость данных на нескольких компьютерах - всегда носить свои файлы (электронные таблицы, базы данных, текстовые файлы и прочее) с собой. Если у пользователя есть физический доступ к компьютеру, с которым он работает, то он должен носить с собой чистый диск CD-RW или USB-диск и просто копировать на них нужные файлы из компьютера.

Однако бывают ситуации, когда нужны файлы с удаленного компьютера или компьютер стоит в серверной комнате и к нему нельзя подключить внешние запоминающие устройства. Тогда пользователь может сделать архив своих файлов (всех или некоторых), подключиться к локальной сети (LAN) или глобальной сети (WAN), скопировать архив на целевой компьютер по сети, разархивировать файлы на целевом компьютере и продолжить свою работу дальше. Более того, можно использовать архивные копии данных в случае "катастрофы", например, если ноутбук был забыт в такси.

На UNIX-системах для работы с архивами применяется утилита tar. Утилита tar связывает один или несколько файлов или каталогов в один файл с сохранением типов файлов, прав доступа к ним, имен их владельцев и местоположения этих файлов в исходной файловой системе. Утилита tar записывает точную копию ваших данных на ленту: tar расшифровывается как tape archiver (кассетный архиватор).

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

Листинг 1. Каталог с файлами
$ cd stuff
$ ls -lR
.:
drwxr-xr-x  2 mstreicher mstreicher   4096 Oct 12 19:11 css
-rwxr-xr-x  1 mstreicher mstreicher     91 Aug 17  2005 demo.rb
-rw-r--r--  1 mstreicher mstreicher 111563 Oct 12 19:10 tech.pdf

./css:
total 16
-rw-r--r--  1 mstreicher mstreicher   711 Mar 25  2006 style.css
-rw-r--r--  1 mstreicher mstreicher 11353 Apr 10  2006 valid.css

Чтобы создать архив для двух файлов и каталога, запустим tar:

$ tar --create --verbose --gzip --file archive.tgz *
css/
css/style.css
css/valid.css
demo.rb
tech.pdf

Опция --create сообщает tar, что надо создать архив. Опция --verbose выводит список файлов, с которыми tar работает. Опция --gzip позволяет осуществлять gzip-компрессию, которая сжимает архив, и --file archive.tgz задает имя архива.

Оболочка shell интерпретирует символ "звездочка" (*) как "любой файл" и, следовательно, распространяет действие архиватора на два файла и каталог. B информации, выводимой tar, видно, что tar архивирует каталог css и повторно вызывается для архивации его содержимого.

После выполнения tar, текущий рабочий каталог содержит новый файл archive.tgz:

$ ls -l archive.tgz
-rw-r--r--  1 mstreicher mstreicher 105470 Oct 13 17:16 archive.tgz

Теперь можно скопировать archive.tgz на другой компьютер и использовать tar на удаленном компьютере для извлечения данных из этого архива. Команда, восстанавливающая файлы, очень похожа на команду для их архивирования. Для разархивирования используется команда:

$ tar --extract --verbose --gunzip --preserve-permissions --file archive.tgz

Эта tar-команда извлечет содержимое архива archive.tgz. Опция --extract является противоположностью опции --create. Опция --gunzip обратна опции --gzip, а --preserve-permissions восстанавливает права доступа, использовавшиеся в исходных файлах.

После выполнения этой команды сохраненные файлы восстановлены с сохранением времени изменения, своих прав доступа и своих имен. Каталог css со своим содержимым также создается в situ.

Утилита tar имеет множество опций: --create, --extract и --list (которая выводит содержимое .tar-файла, не извлекая его). Другие опции (например, --gzip и --preserve-permissions) управляют процессом создания tar-архива. Подробное описание синтаксиса каждой опции можно найти на странице tar в руководстве man для конкретной версии UNIX ОС.

Создание архива, копирование его на целевой компьютер и последующее извлечение данных из него очень полезно, но может стать очень трудоемким процессом. Кроме того, если архив очень большой, то может не хватить места на диске для одновременного хранения самого архива и извлеченных из него файлов. Если компьютер-источник и целевой компьютер связаны по LAN или WAN, то для экономии времени можно комбинировать использование SSH (Secure Shell) и tar для архивирования, копирования и извлечения файлов за один раз. Вот как это делать:

$ (cd ~/stuff; tar --create --gzip --file - *) | \
  ssh destination tar --extract --gunzip --file --verbose -C stuff

В этой команде выполняется сразу несколько действий. Давайте разберем ее:

  1. Последовательность команд, заключенных в круглых скобках, называют вложенной оболочкой - subshell. Изменения, сделанные в subshell-оболочке - например, изменение каталога, - не повлияют на команду в целом, а затронут только среду вложенной оболочки. Поэтому первая управляющая последовательность - (cd ~/stuff; tar --create --gzip --file - *) меняет текущий рабочий каталог на ~/stuff, а затем запускает tar. Так как за вложенной оболочкой следует перенаправление в канал, то все результаты работы subshell посылаются в следующую на очереди команду.
  2. Как и много других UNIX-утилит, tar может писать в стандартный поток вывода (stdout) и читать из стандартного потока ввода (stdin). И stdout и stdin обычно обозначаются дефисом (-). Поэтому команда --create --file - создает архив в stdout.
  3. Канал (|) передает все результаты работы subshell в утилиту ssh, которая, в свою очередь, передает все необходимые данные с исходного компьютера на удаленный.
  4. Наконец, удаленный компьютер запускает собственный экземпляр утилиты tar для извлечения данных из архива. Теперь --extract --file - считывает архив из стандартного потока ввода. Опция -C принуждает tar на целевом компьютере сменить текущий рабочий каталог на stuff, прежде чем начать какие-либо операции разархивирования. Конечным результатом работы этой команды в целом будет передача архива через ssh и распаковка его в ~/stuff.

Итак, с помощью одной команды архив был создан, передан и распакован. Кстати, слегка изменив эту команду, можно копировать архив с удаленного компьютера на локальный и разархивировать его. Вот команда, которую для этого надо выполнить на локальном компьютере:

$ ssh destination cat archive.tgz | \
  (cd ~/stuff; tar --extract --gunzip --file -)

Архив на удаленном компьютере будет открыт, затем поток байтов из cat будет послан во вложенную оболочку, которая сменит рабочий каталог, а затем извлечет архив. (Добавление -C ~/stuff к команде tar приведет к тем же результатам; пример показывает только то, что subshell тоже могут работать со входными данными.)

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

tar --create --file - * | tar -C /path/to/directory --extract --file -

Копирование файлов

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

Другой способ выполнения этой задачи основан на использовании встроенной в ssh возможности передачи файлов от одного компьютера к другому. sftp - другая реализация ssh - предоставляет все свойства протокола File Transfer Protocol (FTP) и, кроме того, обеспечивает защиту файлов при их передаче (при передаче протоколу FTP отсутствует защита данных, поэтому его, в основном, используют только для загрузки файла с открытых FTP-серверов).

Пользователь, который имеет опыт работы с FTP, легко освоит sftp, который очень похож на FTP. Нужно только ввести sftp destination для подключения к удаленному компьютеру с именем destination и выполнить команду FTP для перемещения файлов (например, cd, lcd, mput и mget).

Другой способ передачи файлов между двумя компьютерами состоит в использовании scp, или secure copy (безопасное копирование). Как видно из названия, scp работает так же, как устаревшая утилита cp: копирует файлы из одного места в другое как в пределах одного компьютера, так и между несколькими компьютерами по сети.

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

Листинг 2. Копирование файлов между двумя компьютерами
$ ls -lF
drwxr-xr-x  2 mstreicher mstreicher   4096 Oct 12 19:11 css/
-rwxr-xr-x  1 mstreicher mstreicher     91 Aug 17  2005 demo.rb*
-rw-r--r--  1 mstreicher mstreicher 111563 Oct 12 19:10 tech.pdf
$ cp -pr * /home/joe/stuff
$ ls -lF /home/joe/stuff
drwxr-xr-x  2 mstreicher mstreicher   4096 Oct 12 19:11 css/
-rwxr-xr-x  1 mstreicher mstreicher     91 Aug 17  2005 demo.rb*
-rw-r--r--  1 mstreicher mstreicher 111563 Oct 12 19:10 tech.pdf

В этом примере, cp -pr рекурсивно копирует все файлы и каталоги в каталог /home/joe/stuff. Опция -r отвечает за рекурсию; опция -p сохраняет время изменения и создания файлов.

Копировать файлы в пределах одного компьютера можно и с помощью scp:

$ scp -pr * /home/joe/stuff

Но если указать удаленную систему, scp скопирует файлы по сети:

$ scp -pr * destination:/home/joe/stuff

Предположим, что каталог /home/joe/stuff существует на удаленном компьютере, и у пользователя есть право записи в него данных; создается точная копия двух файлов и вложенного каталога на удаленном компьютере. Как cp, scp использует опцию -p для сохранения времени изменения файлов и -r для рекурсии.

Утилита scp крайне проста в использовании, особенно в том случае, когда задается открытый ключ и закрытый ключ, чтобы не вводить пароль для каждой операции, выполняемой ssh/scp/sftp.

Однако утилита scp имеет одну особенность, которую надо учитывать. Предположим, что в домашнем каталоге есть подкаталог с именем doc и нужно скопировать его на удаленную систему. Кроме того, необходимо, чтобы содержимое ~/doc заменило содержимое каталога doc на удаленном компьютере в случае, если имена файлов или каталогов при копировании будут совпадать. Команда, которая решит эту задачу, будет выглядеть так:

$ scp -pr ~/doc destination:/path/to/doc

Обратите внимание, что в описании пути к каталогу на удаленном компьютере не хватает закрывающего слэша (/). scp интерпретирует данную команду как "копировать содержимое каталога ~/doc в каталог /path/to/doc на удаленном компьютере". Как и при использовании команды cp, удаленные файлы и каталоги, чьи имена совпадают с именами файлов и каталогов, которые будут скопированы, перезаписываются, а уникальные файлы на удаленной системе остаются нетронутыми.

Однако посмотрим, что изменится, если добавить закрывающий слэш:

$ scp -pr ~/doc destination:/path/to/doc/

Тогда scp интерпретирует команду как "копировать каталог ~/doc в каталог /path/to/doc/." Поэтому вместо перезаписи содержимого удаленного каталога, каталог doc на исходном компьютере будет просто скопирован в удаленный каталог.

Наличие или отсутствие закрывающего слэша не является ошибкой - его следует использовать в зависимости от ситуации.


Синхронизация данных

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

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

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

Как и в tar, можно комбинировать использование rsync с ssh для соединения с удаленной системой и синхронизации файлов на удаленном и локальном компьютерах. Как и в scp, можно использовать rsync для копирования файлов на локальном компьютере. Также можно использовать rsync для получения списка файлов.

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

$ rsync -e ssh --times *.txt destination:

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

$ rsync -e ssh --times --perms --recursive --delete doc destination:

Эта команда rsync отображает локальный каталог doc в домашний каталог на удаленном компьютере. Время изменения, доступа и создания файла сохраняются, права доступа к файлу тоже сохраняются, а лишние файлы (файлы в удаленном каталоге, которые не существуют в исходном) удаляются.

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

Листинге 3. Наблюдаем за действиями rsync
$ rsync -e ssh --dry-run --times --perms --recursive --delete bin destination:
building file list ... done
bin/
skipping non-regular file "bin/HTML.pl"
skipping non-regular file "bin/Quark.pl"
bin/Responses/
bin/Responses/DBI.pm
bin/Responses/Response.pm
skipping non-regular file "bin/XML.pl"
bin/backupdca.sh
bin/lib/
bin/report.pl
bin/report.txt

sent 724 bytes  received 108 bytes  554.67 bytes/sec
total size is 168879  speedup is 202.98

rsync имеет следующие опции:

  • -a самая мощная опция, поскольку является сокращением для управляющей последовательности --group --owner --perms --times --devices --links --recursive. Параметр --devices пересоздает файлы устройств, а параметр --links копирует сами символьные ссылки, а не то, на что они указывают.
  • --update не допускает, чтобы rsync перезаписал новые версии файлов более старыми. Если на удаленной системе находится файл более новой версии, чем на локальной системе, этот файл сохраняется без изменений.
  • Попробуйте использовать --verbose чтобы посмотреть, как работает утилита rsync.

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


Заключение

UNIX используется в сетевых системах уже более 20 лет. За это время произошли значительные изменения в оборудовании, но большинство программного обеспечения осталось тем же, и и работа с ним все также предоставляет определенные сложности для системных администраторов и пользователей. Одной из самых главных проблем становится отслеживание данных, которое становится все сложнее из-за постоянно увеличивающейся емкости дисков. Такие утилиты, как tar, sftp/scp и rsync помогут навести порядок даже на самом запущенном компьютере.

Часть 6 этого цикла статей рассмотрит понятие автоматизации - еще один способ сэкономить время и уменьшить риск ошибки из-за человеческого фактора.

Ресурсы

Научиться

  • Speaking UNIX, Part 5: Data, data everywhere (EN): оригинал статьи.
  • Speaking UNIX : другие статьи этого цикла.
  • zsh Mailing List Archive: эта рассылка помогает узнать больше о работе с оболочкой Z shell и ее возможностях.(EN)
  • AIX и UNIX: в данном разделе сайта developerWorks находится различная информация по всем аспектам системного администрирования AIX и приемам работы с UNIX.
  • developerWorks technical events and webcasts: последние новости о событиях и Web-трансляциях сообщества developerWorks.(EN)
  • Podcasts: аудиозаписи презентаций экспертов IBM.(EN)
  • Новичок в AIX и UNIX?: страница AIX и UNIX для новичков.
  • AIX 5L Wiki: совместная разработка документации AIX.(EN)
  • Technology bookstore: сайт магазина книг по ИТ.(EN)

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

  • Z shell: c домашней страницы проекта Z shell можно загрузить последнюю версию Z shell.(EN)
  • 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=291924
ArticleTitle=Использование UNIX: Часть 5. Манипуляции с файлами
publish-date=02272008