Копирование файлов
Любой, у кого есть хотя бы небольшой опыт работы в 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 позволяет выбрать одну из трех возможных схем присвоения имен.
t
или
numbered.
Последовательная нумерация резервных копий: при многократном копировании образуется их последовательность вида FileName . ~1~, FileName . ~2~ и т.д.
nil или existing
. Если уже существует копия с последовательной нумерацией, создается следующая такая же, в противном случае - обычная резервная копия.
never
или simple
. Создание обычной резервной копии с тильдой в имени или другим символом, указанным флажком -S.
Например, чтобы в рассмотренном примере была создана нумерованная резервная копия,
необходимо ввести команду
$ ср — 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 (суффикс) |
||
$ ср -i -Ь -V simple -S _ -R ThisDir /tmp
Эта же команда с длинными флажками:
$ ср --interactive —backup --version-control simple --suffix _
->
—recursive ThisDir /tmp
Безусловно, вторая команда более удобочитаема, но кто же возьмется набрать такое на клавиатуре!