Команда cp
Начнем с копирования -- это выполняется очень простой командой, cp
, имеющей, однако, весьма разнообразные аспекты применения. В самом простом своем виде она требует всего двух аргументов -- имени файла-источника на первом месте и имени целевого файла -- на втором:
$ cp file_source file_target
Этим в текущем каталоге создается новый файл (file_target
), идентичный по содержанию копируемому (file_source). То есть область данных первого будет дублировать таковую последнего. Однако области метаданных у них будут различны изначально. Целевой файл -- это именно новый файл, со своим иднетификатором inode
, заведомо иными временными атрибутами; его атрибуты доступа и принадлежности в общем случае также не обязаны совпадать с таковыми файла-источника.
Новый файл может быть создан и в произвольном каталоге, к которому пользователь имеет соответствующий доступ: для этого следует только указать полный путь к нему:
$ cp file_source dir/subdir/file_target
Если в качестве второго аргумента команды указано просто имя каталога, то новый файл будет создан в нем с именем, идентичным имени файла-источника. Однако подчеркну, что в любом случае копирования создается именно новый файл, никак после этого не связанный с файлом исходным.
Если в качестве последнего аргумента выступает имя каталога, он может предваряться любым количеством аргументов -- имен файлов:
$ cp file1 file2 ... file3 dir/
В этом случае в целевом каталоге dir/
будут созданы новые файлы,
идентичные по содержанию файлам file1
, file2
и т.д.
Если в целевом (или текущем) каталоге уже имеется файл с именем, совпадающим с именем вновь создаваемого файла, он в общем случае будет без предупреждения заменен новым файлом. Единственное средство для предотвращения этого -- задание опции -i
(от interactive) -- при ее наличии последует запрос
на перезапись существующего файла:
$ cp -i file1 file2 overwrite file2? (y/n [n])
Как будет показано в субпроекте о командных оболочках, некоторые из них могут быть настроены так, чтобы по умолчанию не допускать перезаписи существующих файлов. Однако если такая потребность осознанно возникнет, это можно выполнить с помощью опции -f
(от force). К слову сказать, она также аннулирует действие опции -i
, например, при использовании ее в псевдониме команды cp
.
Имя каталога может выступать и в качестве первого аргумента команды cp
. Однако это потребует опции -R
(иногда допустима и опция -r
-- в обоих случаях от recursive). В этом случае второй аргумент также будет воспринят как имя каталога, который не только будет создан при этом, но в нем также будет рекурсивно воспроизведено содержимое каталога источника (включая и вложенные подкаталоги).
При копировании файлов, представляющих собой символические ссылки, они будут преобразованы в регулярные файлы, копирующие содержимое файлов -- источников ссылки. Однако при рекурсивном копировании каталогов, содержащих символические ссылки, возможно их воспроизведение в первозданном виде. Для этого вместе с опцией -R
должна быть указана одна из опций -H
или -L
. Однако обе они при отсутствии -R игнорируются.
Как уже было сказано, создаваемые при копировании целевые файлы по умолчанию получают атрибуты доступа и времени, не зависящие от таковых файла-источника. Обычно они определяются значением переменной umask
, заданной глобально, через класс учетной записи пользователя или в профильном файле командной оболочки пользователя (по умолчанию во FreeBSD значение umask
-- 022. Однако при желании атрибуты исходного файла можно сохранить в файле целевом -- для этого предназначена опция -p
. Разумеется, атрибуты эти будут сохранены только в том случае, это это допустимо целевой файловой системой: не следует ожидать, что атрибуты доступа и принадлежности будут сохранены при копировании на носитель с файловой системой FAT.
Для выполнения операции копирования файла он должен иметь атрибут чтения для пользователя, выполняющего копирование; кроме того, последний должен обладать правом на изменение каталога, в который производится копирование.
Содержание . .