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

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

В Linux для копирования применяется команда ср (/bin/cp).

Основные операции копирования

Безусловно, простейшее применение команды ср - копирование файла из одного каталога в другой или создание дубликата в том же каталоге. Например, чтобы создать копию файла Thisfile, поместив ее в том же каталоге под именем Thisfile-Acopy, необходимо ввести следующую команду:

$ ср Thisfile Thisfile-Acopy

Если теперь заглянуть в указанный каталог при помощи команды 1s -1, то в нем окажется два файла абсолютно одинакового объема, но с разными датами создания. Дата создания нового файла совпадет с датой копирования, первоначальный же останется неизменным. Изменение файлаThisfile-Acopy не затронет файл Thisfile.

Аналогично, можно копировать файл Thisfile в каталог /tmp (например, чтобы предоставить к нему доступ другому пользователю). Для этого воспользуйтесь следующей командой.

$ ср Thisfile /tmp

Если файл, копируемый в другой каталог, требуется еще и переименовать, следует ввести команду:

$ ср Thisfile /tmp/NewfileName

Не записывайте поверх существующего файла

Все дистрибутивы Linux имеют один существенный недостаток: при копировании файлов существует опасность записи копии поверх существующего файла, Предположим, у вас есть два файла- Thisf%le и Newfile. Если вы решите создать копию одного из них, введя команду

$ ср Thisfile Newfile

копия запишется поверх файла Newfile, что приведет к его утрате (если, конечно, вы не были настолько предусмотрительны, чтобы позаботиться о резервной копии).

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

$ ср -i Thisfile Newfile

ср: overwrite 'Thisfile'?

Чтобы обезопасить себя от подобных неприятностей, создайте алиас (псевдоимя) команды ср следующей командой:

$ alias cp='cp -i

Теперь при каждом обращении к команде ср последняя автоматически будет превращаться в команду ср —i. Следовательно, будет выводиться предупреждение о-каждом случае копирования поверх существующего файла. Как показано в гл. 16, модифицированием файла . bashrc можно конфигурировать оболочку bash так, чтобы указанный псевдоним устанавливался при каждом входе в систему. (Оболочка - программа, управляющая средой командной строки,)

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

Копирование нескольких файлов одной командой

Одним из недостатков команды сору системы DOS является то, что в ней можно указать лишь одно имя файла или выражение. Например, по команде

$ copy file /temp

происходит копирование файла file в каталог / temp. Другой вариант: $ copy *.tsct /temp

В этом случае, в каталог /temp копируются все текстовые файлы из текущего каталога. Если необходимо скопировать три отдельных файла, придется вводить команду трижды. Для копирования всех текстовых и выполняемых (. ехе) файлов текущего каталога команду придется вводить дважды.

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

Рассмотрим пример. Предположим, нам надо скопировать файлы fileOne, fileTwo и fileThree из текущего каталога в каталог /trap. Естественно, это можно сделать, введя команду копирования трижды.

$ ср fileOne /tmp

$ ср fileTwo /tmp

$ ср fileThree /tmp

Можно упростить задачу, объединив три команды в одну. $ ср fileOne fileTwo fileThree /tmp

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

$ ср *.txt *.doc *.bak /tmp

В этом случае происходит копирование всех файлов, имена которых имеют одно из трех указанных расширений.

Примечание

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

ср: when copying multiple files, last argument must be a directory. Try 'cp —help'for more information. (При копировании нескольких файлов последним надо указывать каталог. Для получения дополнительной информации введите 'ср --help'.)

Для копирования целого каталога со всеми подкаталогами введите команду ср с флажком -R. Если в текущем каталоге существует подкаталог SomeDir, то для рекурсивного копирования этого подкаталога (со всем его содержимым) в подкаталог / tmp воспользуйтесь следующей командой.

$ ср -R SomeDir /tmp

При копировании будет создан новый каталог /tmp/SomeDir, в который и будет скопировано содержимое исходного подкаталога SomeDir.

Дополнительные возможности

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

Обеспечение идентичности копии и оригинала

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

Владельцем копии файла обычно становится пользователь, выполнивший копирование, а не создатель файла-оригинала. Предположим, файл Thefile был создан пользователем userl и помещен в каталог /tmp, чтобы пользователь user2 смог копировать его оттуда в свой исходный каталог. В списке файлов этот файл выглядит примерно так:

-rw-r—r-- 1 userl users 16992 Apr 5 12:10 Thefile

После того, как пользователь user2 скопирует этот файл командой

$ ср /tmp/Thefile -/Newfile

он становится владельцем файла-копии.

-rw-rw-r-- i user2 users 16992 Apr 5 13:10 Newfile

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

Иногда в копии необходимо сохранить все атрибуты файла-оригинала. Предположим, что корневой пользователь создает на съемном диске резервную копию некоторого набора файлов. В отличие от обычного архивирования на магнитную ленту, требующего других средств, в этом случае можно воспользоваться командой ср. Но резервные копии должны полностью соответствовать оригиналам. Самое время вспомнить о флажке -р, установка которого позволяет сохранить в копии все атрибуты оригинала. Если, возвращаясь к предыдущему примеру, вести команду

$ ср -р /tmp/Thefile

копия будет неотличима от оригинала:

-rw-r--r-- i userl users 16992 Apr 5 12:10 Thefile

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

При обычном копировании символической ссылки происходит копирование не ее самой, ,а файла, на который она указывает. Например, если бы в предыдущем примере Thefile было именем символической ссылки:

irwxrwxrwx 1 userl users 16992 Apr 5 12:10 Thefile Otherfile

то результат ввода команды

$ ср /tmp/Thefile -/Newfile

был бы следующим:

-rw-rw-r-- 1 user2 users 16992 Apr 5 13:10 Newfile

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

irwxrwxrwx 1 user2 users 2 Apr 5 13:10 Newfile /tmp/Otherfile

В команде ср для этого предусмотрен флажок. Флажок -d отменяет разыменование ссылки. Команда копирования принимает вид:

S ср -d /tmp/Thefile -/Newfile

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

$ ср -pdR TheDirectory /backups

создается точная копия каталога TheDirectory в каталоге /backups /TheDirectory.

$ ср -a. TheDirectory /backups

Предотвращение ошибок

Мы рассмотрели один метод предотвращения ошибок - использование флажка -i, устанавли- каталогов. Существуют и другие методы установки разных степеней защиты.

Один из них - установка флажка -Ь для создания резервных копий файлов и каталогов, поверх КОТОРЫХ производится копирование. По умолчанию резервной копии присваивается имя файла- оригинала с добавленным в конце знаком тильды (~). Таким образом, если воспользоваться командой

$ ср -b fileOne fileTwo

для копирования файла fileOne в существующий файл fileTwo, будет создана резер'вная копия последнего с именем fileTwo-.

Правило присвоения имен резервным копиям можно изменять установкой флажка -S или. Флажок -S служит для замены тильды в конце имени резервной копии другим символом. Например, по команде

$ ср -b -S _ fileOne fileTwo

резервной копии файла fileTwo будет присвоено имя fileTwo_.

Флажок — backup позволяет выбрать одну из трех возможных схем присвоения имен.

Например, чтобы в рассмотренном примере была создана нумерованная резервная копия, необходимо ввести команду

$ ср — backup= t fileOne fileTwo или

$ ср -backup=numbered fileOne fileTwo

Аналогично, вводом команды

$ ср -backup=never fileOne fileTwo и

$ ср --backup=simple fileOne fileTwo

создаются обычные резервные копии.

Флажок -b в Red Hat Linux 7.1 с этими опциями не работает.

Примечание

В Red Hat Linux 7.1 по-прежнему можно использовать флажок -v для управления схемой присвоения имен. Однако в будущих версиях ср этот флажок уже будет недоступен.

Альтернативные формы флажков

Вероятно, вы обратили внимание на разнообразие флажков команды ср, в котором нетрудно запутаться. К счастью, для каждого флажка предусмотрена длинная, но легко запоминаемая формаг

Краткая форма Длинная форма

-i

— interactive (интерактивное)

-R

--recursive (рекурсивное)


— preserve (предохранить)


— no-dereference (без разыменования)


— archive (архивное)


— backup (резервное)

-S

--suffix (суффикс)

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

$ ср -i -Ь -V simple -S _ -R ThisDir /tmp

Эта же команда с длинными флажками:

$ ср --interactive —backup --version-control simple --suffix _

-> —recursive ThisDir /tmp

Безусловно, вторая команда более удобочитаема, но кто же возьмется набрать такое на клавиатуре!